nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS)
Posted: Updated:
nginxは無料で利用できるオープンソースのハイパフォーマンスHTTPサーバ
NginxはC10K問題に 取り組むべく開発された一握りのサーバのうちの一つです。従来のサーバとは異なり、Nginxはリクエストの処理をスレッドに依存していません。その代わ りにもっとスケーラブルな(非同期の)イベント駆動アーキテクチャを使用しています。このアーキテクチャはメモリ使用量が少ないだけでなく、最も重要な事 として、稼働時のメモリ使用量が予測可能であるということです。 NginxJa ( 日本語Wiki )
※C10K問題は、Web2.0の先にあるC10K問題 − @ITが端的な説明を示している
nginxってのを使ってみよう
そんなわけでnginxってのが速くてイカしてるとのことなので、とりあえず導入だけしてみようということでトライ。最終的には、画像やCSSなどの静的ファイルをnginxが返し、動的部分を担うPHPはapacheにパスして返すように設定しました。
実際はもっと右往左往していたのですが、この記事では前述の構成を作った際の手順をストレートにまとめ直します。php-fastcgiとやらを組み合わせてnginx単体で全てのリクエストをさばくのはまた今度試します。
今回、特に参考にさせていただいたのは 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール | KRAY Inc の記事です。ありがとうございます。
mod_rpafのインストール
apache側に、mod_rpafというリバースプロキシのモジュールが必要とのことなので、構築/Linux サーバ/Web Server/2.b apache(with mod rpaf)によるAPサーバ構築 - スゴイようぃっきー!を参考にインストール。
% wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz % tar xvzf mod_rpaf-0.6.tar.gz % cd mod_rpaf-0.6
ダウンロードして展開する。
% emacs Makefile -APXS=$(shell which apxs) +APXS2=/usr/sbin/apxs
Makefileのパスを一部書き換える。
% make rpaf-2.0 /usr/sbin/apxs -c -n mod_rpaf-2.0.o mod_rpaf-2.0.c make: /usr/sbin/apxs: Command not found make: *** [mod_rpaf-2.0.o] Error 127
ここで、apxsが無いと言われる。CentOSにはapxsが入ってないようなので、http-develを別途入れ直す。(CentOSサーバにはapxsがないという問題の解決 - 私たちの世界 - Yahoo!ブログ)
% sudo yum install http-devel Installed: httpd-devel.i386 0:2.2.3-43.el5.centos.3 httpd-devel.x86_64 0:2.2.3-43.el5.centos.3 Dependency Installed: apr-devel.x86_64 0:1.2.7-11.el5_5.3 apr-util-devel.x86_64 0:1.2.7-11.el5_5.2 cyrus-sasl-devel.x86_64 0:2.1.22-5.el5_4.3 db4-devel.x86_64 0:4.3.29-10.el5_5.2 expat-devel.x86_64 0:1.95.8-8.3.el5_5.3 openldap-devel.x86_64 0:2.3.43-12.el5_5.3 Complete!
これでapxsが入ったはずなのでリトライ。
% make rpaf-2.0 % sudo make install-2.0
今度はOK!
nginxのインストール
nginx自体はyum(EPEL)からあっさりとインストール可能。
% sudo yum install nginx % yum list installed | grep nginx nginx.x86_64 0.8.53-1.el5 installed
バージョンは0.8.53とのこと。今回はこれでいきます。
まずはnginx.confを設定する
下記は軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール | KRAY Incのそのまま参考にさせていただいたnginx側の設定。件の設定はserverの中に書く。
% sudo emacs /etc/nginx/nginx.conf server { listen 80; server_name example.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_max_temp_file_size 0; location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { root /home/user/html/; index index.html; ssi on; break; } location / { proxy_pass http://127.0.0.1:8082; break; } (デフォルトの記述を残しているだけなので色々と以下略) }
8082なのは参考元の例示の名残なので空いてるポートを好きに選びます。
nginx側のバーチャルホスト設定
nginx.confのデフォルト設定は適当にやっつけておきつつ、virtual.confにバーチャルホスト用の振り分けを定義していく。
% sudo emacs /etc/nginx/conf.d/virtual.conf server { listen 80; server_name hogehoge.example.com; location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { root /home/user/hogehoge; index index.html; ssi on; break; } location / { proxy_pass http://127.0.0.1:1111; break; } } server { listen 80; server_name fugafuga.example.com; location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { root /home/user/fugafuga; index index.html; ssi on; break; } location / { proxy_pass http://127.0.0.1:2222; break; } }
apache側のバーチャルホスト設定
受け取り側のhttpdでは、それぞれのポートをListenしてnginx経由のアクセスを各バーチャルホストに振り分ける。ここでのポートは、外部から参照するポートではないので、iptablesで新規に設定をする必要はない。
% sudo emacs /etc/httpd/conf/httpd.conf # 繰り返すようですが、ポートは任意の空いてるヤツを.下記はテキトーです. Listen 8082 Listen 1111 Listen 2222 <VirtualHost 127.0.0.1:8082> ServerName example.com DocumentRoot /home/user/html RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 10.0.0.1 RPAFheader X-Forwarded-For </VirtualHost> <VirtualHost 127.0.0.1:1111> ServerName hogehoge.example.com DocumentRoot /home/user/hogehoge RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 10.0.0.1 RPAFheader X-Forwarded-For </VirtualHost> <VirtualHost 127.0.0.1:2222> ServerName fugafuga.example.com DocumentRoot /home/user/fugafuga RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 10.0.0.1 RPAFheader X-Forwarded-For </VirtualHost>
サービスを再起動しておわり
% sudo /etc/init.d/httpd restart % sudo /etc/init.d/nginx start
先に、80番ポートをめがけてnginxを起動すると、httpdがbindしたままで怒られるので、基本的にはhttpdを再起動した後にnginxを起動させる。設定直後だけですが。様子を見ながら設定するときは、80番をhttpdに持たせたまま適当なポート番号をnginxに与えた状態で試せばいい。
ハード気味な実案件で使ってみれたら楽しい
のになぁ、と思わないでもないけど。このブログのアクセスは別に多くないので、実際の所パフォーマンスを気にする必要がある身分ではないのですが、モノは試してみました。例によって、ブログに残したので手順を忘れても安心になりました。では。
参考サイト
- NginxJa
- 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール | KRAY Inc
- Top 20 Nginx WebServer Best Security Practices
- ウノウラボ by Zynga Japan: Tips for nginx
- Web2.0の先にあるC10K問題 − @IT
- 構築/Linux サーバ/Web Server/2.b apache(with mod rpaf)によるAPサーバ構築 - スゴイようぃっきー!
- CentOSサーバにはapxsがないという問題の解決 - 私たちの世界 - Yahoo!ブログ