nginxベースの高速なWordPress環境をお名前.comのVPSで構築 4ページ

nginxサーバーのインストール

 WordPressの動作が確認できたところで、nginxサーバーをインストールしていく。nginxは開発サイトのパッケージリポジトリから直接導入する。リスト3のようなリポジトリファイルを作成し、yumコマンドでインストールする。

# vi /etc/yum.repos.d/nginx.repo  ←nginx.repoファイルを作成・編集する
# yum install nginx  ←nginxのインストールを実行する

リスト3 /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

 インストールできたらApacheを停止し、nginxを起動して動作を確認しよう。

# /etc/init.d/httpd stop
# /etc/init.d/nginx start

 VPSにWebブラウザでアクセスし、図17のようなシンプルな画面が表示されればOKだ。

図17 nginxの初期画面
図17 nginxの初期画面

 なお、nginxはモジュールで機能を追加できるが、標準のバイナリパッケージがどのように構築されているかは「-V」オプションで確認できる。

# nginx -V
nginx version: nginx/1.2.3
built by gcc 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-cc-opt='-O2 -g'

PHP-FPMのインストールと設定

 CentOS 6.3ではFastCGI経由でPHPを利用するための「PHP-FPM」が用意されておらず、PHPのバージョンも少し古い。そこで最新のパッケージを配布している「Remiリポジトリ」からPHPの最新版を導入する。一連の作業手順は以下のようになる。

# cd /tmp
# wget
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
# rpm -ivh epel-release-6-7.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -ivh remi-release-6.rpm
# yum update
# yum --enablerepo=remi update php php-fpm

 このときPHPのアップグレードに関連してMySQLもアップグレードされるので、mysql_upgradeを実行してデータベースをアップデートしておく。

# mysql_upgrade -u root -p
Enter password:

 PHP-FPMの設定は/etc/php-fpm.d/www.confファイルで行う。このファイルで修正が必要な部分はリスト4の項目である。

リスト4 PHP-FPMの設定(/etc/php-fpm.d/www.conf)で修正が必要な部分

listen = /var/run/php-fpm/php-fpm.sock

user = nginx
group = nginx

pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5

 まず「listen」はPHP-FPMが待ち受けを行うポートの設定である。標準では「listen = 127.0.0.1:9000」、つまりローカルホストの9000番ポートになっているが、ここではIPアドレスやポートだけでなくUNIXドメインソケットも指定でき、こちらを利用するほうが高速な処理が可能である。任意のファイルをソケットとして指定できるが、ここではPHP-FPMのPIDファイルが設置されている/var/run/php-fpmディレクトリ以下のファイルを指定している。指定したファイルを作成する必要はなく、PHP-FPMをこの設定で起動すれば自動作成される。

 「user」および「group」はPHP-FPMの動作ユーザーおよびグループである。WordPressが動作するときはここで指定した権限で書き込みが発生するため、適切な設定をしておかないと不具合が発生する。ここではサーバー権限にあわせて「nginx」と設定しておく。また、WordPressの動作確認時に/var/www/wordpressディレクトリ下のパーミッションをApache向けに変更しているので、これらの所有者を「nginx」に変更しておく。

# chown -R nginx /var/www/wordpress

 「pm.max_children」などの設定は、PHP-FPMの起動プロセス数を指定するものだ。VPSの空きメモリ状況に合わせて設定していくのだが、PHP-FPMのインストール標準の状態では負荷をかけるとメモリを使い切ってしまうほどにプロセスが起動し、スワップが発生して全体動作が遅くなってしまう。MySQLの標準状態+nginxの環境では、メモリ1GBの環境で20プロセス前後まで起動していても200MBを超えるくらいの余裕がある。MySQLにどのくらいメモリを割り当てるか、VPS上でWordPress以外のプロセスをどのくらい動作させるかにもよるが、最終的にはほとんどがキャッシュアクセスで多くのプロセスは必要ないため、最大15プロセス前後と設定しておくのが無難なところだろう。

 なお、動的にプロセス数を変動させるのではなく、「pm = static」と設定し、「pm.max_children」に常時稼動プロセス数を設定しておく運用も可能である。メモリを見積もる際はこちらの設定で調整を行うと分かりやすい。

 設定が完了したら、PHP-FPMを起動させて常駐させておく。OS起動時に動作するようchkconfigで起動設定も行っておく。

# /etc/init.d/php-fpm start
# chkconfig
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off

# chkconfig php-fpm on
# chkconfig
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off

WordPress向けのnginxの設定

 あとはnginxの設定を調整すれば完了である。nginxの設定は/etc/nginx/conf.d以下の設定ファイルで行う。拡張子が「.conf」のファイルが読み込まれるので、バックアップファイルなどを同ディレクトリに置く際は拡張子には注意されたい。標準ではdefault.confファイルが用意されており、まずはプロキシ機能なしに最低限WordPressが動くようにこのファイルをリスト5のように修正する。

リスト5 WordPress向けの最低限の設定(/etc/nginx/conf.d/default.conf)

root /var/www/wordpress;
index index.php;

server {
        listen 80 default_server;
        try_files $uri $uri/ /index.php;

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

 修正したらnginxを再起動して、WordPressが動作するか確認しよう。

# /etc/init.d/nginx restart

 もしWordPressの画面が表示されないようであれば、PHP-FRMの設定やnginxの設定を再度確認しておく。

 設定の概要を簡単に説明しておくと、まず「try_files」の設定によって、実ファイルがない場合は「/index.php」へのアクセスとなる。WordPressのパーマリンク設定もこの設定行によって対応できている。次に拡張子が「.php」のファイルに対するアクセスは、「fastcgi_pass」によってPHP-FRMに接続され、指定されたファイルが実行される。ここでソケットファイルのパスの先頭にはUNIXドメインソケットである旨の「unix:」を付与しておく。

 この時点でab(Apache Bench)コマンドによるリクエスト処理能力を測定したところ、Apache上のWordPressとほぼ同じであった。

Apache/2.2.15	12.86リクエスト/秒
nginx 1.2.3	12.51リクエスト/秒

 ここでは、サーバー外(お名前.comの別のVPS環境)にて、「ab -n 1000 -c 20」のようなオプションを指定してabコマンドを実行し測定を行っている。対象コンテンツはSourceForge.JP Magazineの記事(https://mag.osdn.jp/12/07/31/0736250)を固定ページとして設置したページで、WordPressのデフォルトトップページよりもやや重いものである。実際の環境を想定してネットワークを介した外部からのベンチとしているが、この時点ではボトルネックがPHP側にあるため、内部からabコマンドを実行してもほぼ同様の結果となった。