nginxプロキシおよびWebサーバーのインストールとコンフィグレーションを行う
自分のサーバーに最新の安定バージョンのnginxをダウンロードし、インストールします。
cd nginx-0.5.35 ./configure make sudo make install
これで、nginxが/usr/local/nginxにインストールされます。ファイル/usr/local/nginx/conf/nginx.confを以下のように編集してください。
worker_processes 3; error_log logs/error.log notice; error_log logs/warning.log warning; pid logs/nginx.pid; events { worker_connections 1024; } http { include conf/mime.types; default_type application/octet-stream; tcp_nopush on; keepalive_timeout 65; tcp_nodelay on; upstream mongrel { server 127.0.0.1:3001; server 127.0.0.1:3002; server 127.0.0.1:3003; } gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; server { listen 80; server_name cookingspace.com; root /var/mongrel/cookingspace/public; access_log off; rewrite_log on; location / { proxy_pass http://mongrel; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
テストをするには、Mongrelクラスタが起動していることを確認してから、手動でnginxを実行してください。
cd /usr/local/nginx/ sbin/nginx -c conf/nginx.conf
Mongrelクラスタとnginxを自動で起動する
この節を書くには少々苦労しました。というのは、起動プロセスを管理するツールはLinuxディストリビューションの種類によって微妙に異なるからです。とは言っても、多少「昔かたぎ」な方法ではありますが、大半のLinuxディストリビューション(FreeBSDなども含む)は/etc/rc.localにstartupコマンドを用意しているはずなので、ここではそれを利用することにします。実際にテストしたLinuxサーバーは1つだけです。
# I made sure that /usr/local installs are visible: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH export PATH=$PATH:/usr/local/bin # start memcached using a non-privileged account: /usr/local/bin/memcached -d -m 16384 -l 127.0.0.1 -p 11211 -u cookingspace > /home/cookingspace/memcached.log & # start the mongrel cluster and nginx using non-privileged accounts: (cd /var/mongrel/cookingspace/ ; su cookingspace -m -c "nohup /usr/local/bin/mongrel_rails cluster::restart > /home/cookingspace/mongrel_rails.log &" ) (cd /usr/local/nginx/ ; sbin/nginx -c conf/nginx.conf) # note: nginx spawns worker processes using a non-privileged account.
少し単純化しすぎたかもしれませんが、この方法にはおそらく大半のシステムで動作するという利点があります。
時間節約ツール
私はサーバーサイドJavaの仕事を10年以上続けてきましたが、Railsアプリケーションを書くことは非常におもしろいと思います。Railsアプリケーションの特徴は、プロジェクト完成までにあまり時間がかからないことです。実際の問題の解決により多くの時間を割くことができ、インフラストラクチャソフトウェアにかける時間は少なくて済みます。もっとも、スケーリングと大規模な開発チームが必要なプロジェクトについては引き続きサーバーサイドJavaを使うつもりです。Java開発に時間がかかる原因として挙げられるJavaの特徴(静的な型指定、冗長だが読みやすいコード)は、大規模な開発チームにとっては逆にメリットにもなります。とは言え、大半のプロジェクトは数人の開発者で簡単に書けるほど小さいものであり、このような中小規模のプロジェクトにはRubyおよびRailsが非常に適しています(ユーザー負荷の増大に応じてサーバーを追加する際のアドバイスについては「補足説明2:スケーリングの際に必要なもの」を参照)。
Railsアプリケーションをサーバーにデプロイするのは簡単な作業ではないと一般に言われています。Linuxシステムの管理に不慣れな場合は、おそらくその通りでしょう。この記事が、皆さんがデプロイメントを行う際の作業時間とストレスの削減に役立てば幸いです。
- 他のサーバーにデータベースを移し、メモリ割り当てを増やす
- 複数のサーバーでMongrelクラスタを実行する