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;
}
}

 これで完了。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です