nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS)

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に与えた状態で試せばいい。

ハード気味な実案件で使ってみれたら楽しい

のになぁ、と思わないでもないけど。このブログのアクセスは別に多くないので、実際の所パフォーマンスを気にする必要がある身分ではないのですが、モノは試してみました。例によって、ブログに残したので手順を忘れても安心になりました。では。

参考サイト