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側に、modrpafというリバースプロキシのモジュールが必要とのことなので、[構築/Linux サーバ/Web Server/2.b apache(with mod rpaf)によるAPサーバ構築 - スゴイようぃっきー!](http://wiki.sugoiyo.com/%E6%A7%8B%E7%AF%89/Linux%E3%82%B5%E3%83%BC%E3%83%90/Web_Server/2.b_apache(with_mod_rpaf)%E3%81%AB%E3%82%88%E3%82%8BAP%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89 "構築/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!ブログ