nginx
仕事で初めてRuby on Railsをやってる。nginx + unicornを使ってるんだけど、今回はnginxのインストール・設定まで。
■nginx + unicornに決めた経緯
ついでにサーバー環境の構築まで頼まれたので、調べてみると、最近はunicornってのが人気らしい。大昔にRoRが流行始めた頃はMongrelが人気があったようだけど。まぁ、よく分からないけどちょっと調べてみた所評判良さそうなんで、unicornを使う事を決定。
次にフロントエンド。Apacheは今まで沢山使ってきたので、nginxを使う事にした。
環境はCentOS 5.0 (諸事情により…)
■nginxのインストール → エラー
以下のようにEPELのレポジトリを使えるようにする。
$ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
後はyum install nginxでインストールするだけ。
と言いたい所なんだけど、環境によってはこのRPMだと、以下のようなエラーを吐いて動かない。
2011/02/01 10:47:18 [emerg] 17484#0: eventfd() failed (38: Function not implemented) 2011/02/01 10:47:18 [alert] 17483#0: worker process 17484 exited with fatal code 2 and can not be respawn
kernelにeventfd()というシステムコールが無いと起きるらしい。他の環境で使っているCentOS 5.5だと問題なかったけど。nginxのフォーラムにも同じような質問がいくつかあった。
■RPMリビルド
解決方法としては、SRPMを取ってきて、configureオプションを変更してリビルド。
$ wget http://download.fedora.redhat.com/pub/epel/5/SRPMS/nginx-0.8.53-1.el5.src.rpm $ sudo rpm -ivh nginx-0.8.53-1.el5.src.rpm
nginx.specを以下のように変更
$ diff -u nginx.spec.org nginx.spec --- nginx.spec.org 2010-11-01 07:52:13.000000000 +0900 +++ nginx.spec 2011-02-01 11:08:44.000000000 +0900 @@ -94,7 +94,6 @@ --with-http_stub_status_module --with-http_perl_module --with-mail - --with-file-aio --with-mail_ssl_module --with-ipv6 --with-cc-opt="%{optflags} $(pcre-config --cflags)"
必要なdevelパッケージを入れてリビルド
$ sudo yum install pcre-devel GeoIP-devel ... $ sudo rpmbuild -bb nginx.spec
EPELのRPMを削除し、リビルドで出来上がったRPMをインストール
$ sudo rpm -e nginx 警告: /etc/nginx/nginx.conf は /etc/nginx/nginx.conf.rpmsave として保存されした 。 $ sudo rpm -ivh nginx-0.8.53-1.i686.rpm
■unicornとの連携
unicornはlocalhostのポート5000番で動くものとする。nginx.confに少し記述するだけなんで、そんなに難しくない。一応
# unicornサーバーの情報。名前 "backend-unicorn" は任意の名前。 upstream backend-unicorn { server 127.0.0.1:5000; } # サーバー全般の定義 server { location / { root /usr/share/nginx/html; index index.html index.htm; # /usr/share/nginx/html内に該当のファイルが無い場合、 # backend-unicornに処理を渡す # Then request it from the unicorn server if (!-f $request_filename) { proxy_pass http://backend-unicorn; break; } }
これで完了。