現在のサーバーはApacheのpreforkモデルで動かしているのですが、負荷テストを行うとよくハングアップしてしまい、再起動しないと復旧しない状態に陥っていました。
新サーバー構築にあたりApacheのworkerモデルも試したものの、設定をチューニングしてもなかなか改善せず……。
そこで、サーバー負荷対策として定評のある「Nginx(エンジンエックス)」を、これを機に初導入してみることにしました!
今回は、CentOS環境へのNginxおよびPHP-FPMのインストール手順と、WordPressを動かすための初期設定・チューニングについてまとめます。
1. Nginxのインストール
まずは最新のNginxを公式サイトからダウンロードします。
今回はyumコマンドで手軽にインストール・管理ができるように、公式のリポジトリ(rpm)を登録してからインストールを行いました。
# Nginxのリポジトリを登録(CentOS 6系の場合)
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpmリポジトリの登録ができたら、yum listでNginxの最新バージョンが認識されているか確認し、インストールを実行します。
(※執筆時点では1.2.8が最新でした)
# バージョンの確認
yum list nginx
# 出力例: nginx.x86_64 1.2.8-1.el6.ngx @nginx
# インストール実行
yum install nginxこれでNginx自体のインストールは完了です。続いて、PHPをNginx上で動かすための設定を行っていきます。
2. php-fpm と spawn-fcgi のインストール
Nginx単体ではPHPを処理できないため、FastCGIプロセスであるphp-fpm(と、必要に応じてspawn-fcgi)をインストールします。
※ここでは、既にサーバーにPHP本体がインストールされている前提で進めます。
yum install php-fpm spawn-fcgiphp-fpmの設定(プロセスのチューニング)
php-fpmの挙動を設定するため、設定ファイル www.conf を編集します。
(※詳細な設定値の仕様についてはPHP公式マニュアルをご参照ください)
# 9000ポートで待ち受けます
listen = 127.0.0.1:9000
# ユーザーとグループの設定(もともとApacheで動かしていたためapacheに設定)
user = apache
group = apache
# 【重要】プロセスマネージャが子プロセスを制御する方法
# static: 子プロセスの数は固定(pm.max_children)。メモリを常に確保するため処理は速い。
# ondemand: リクエストが来た時だけプロセスを立ち上げる。
# dynamic: 状況に応じて動的にプロセス数を増減させる。低負荷時はメモリ消費を抑えられる。
pm = dynamic
# 作成される子プロセスの最大数
pm.max_children = 30
# 起動時に作成される子プロセスの数(dynamic設定時は必須)
pm.start_servers = 5
# アイドル状態のサーバープロセス数の最小値(dynamic設定時は必須)
pm.min_spare_servers = 5
# アイドル状態のサーバープロセス数の最大値(dynamic設定時は必須)
pm.max_spare_servers = 20
# メモリリーク対策:各子プロセスが再起動するまでに実行するリクエスト数
# ここでは1024回処理したらプロセスを再起動してメモリを解放するように設定
pm.max_requests = 1024【ポイント】
サーバーの安定稼働において重要なのは pm = dynamic 以降のプロセス設定です。dynamicにするかstaticにするか、最大子プロセス数をいくつにするかは、サーバーのメモリ容量と実際のアクセス負荷に依存します。負荷テストを行いながら、ご自身の環境に最適な数値を見つけてみてください。
3. Nginxの設定(ワーカー数とCPUバインド)
次に、Nginx側の設定ファイル nginx.conf を編集します。
(※ディレクティブの詳細はNginx公式ドキュメントへ)
# Apacheから移行したため、実行ユーザーをapacheに合わせています
user apache;
# HTTPを処理するワーカープロセス数(基本はCPUのコア数に合わせる)
worker_processes 3;
# ▼以下、CPUアフィニティ(どのCPUコアに割り当てるか)の追加設定▼
# CPUのコア数 = 2進数の桁数として割り当てを指定します。
worker_cpu_affinity 001 010 100;
# (例) 2コアの場合:01 10 10(1つのコアに2プロセス使う等)
# (例) 4コアの場合:0001 0010 0100 1000 のうち3つを記述
# ▲追加ここまで▲バーチャルホスト(default.conf)の設定
続いて、ドキュメントルートやWordPressを動かすためのルーティング設定を default.conf に記述します。
server {
listen 80;
# サーバー名の変更(ご自身のドメインに変更してください)
server_name example.jp;
# ログの出力先
access_log /var/log/nginx/log/access.log main;
error_log /var/log/nginx/log/error.log;
location / {
# ドキュメントルートの設定
root /usr/share/nginx/html;
index index.php index.html index.htm;
# WordPressでパーマリンクを設定している場合は以下のリライトルールが必要
if (!-e $request_filename) {
rewrite ^.+?($/-.*) $1 last;
rewrite ^.+?(/.*\.php)$ $1 last;
rewrite ^ /index.php last;
}
}
# PHPをphp-fpm経由で処理させるための設定
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# セキュリティ対策:.htaccessなどの不可視ファイルへのアクセスを拒否
# Nginxは.htaccessを読み込まないため、直接中身が見えないようブロックします
location ~ /\.ht {
deny all;
}
}4. 起動と動作確認
すべての設定ファイルが記述できたら、php-fpmとNginxを起動します。
/etc/rc.d/init.d/php-fpm start
/etc/rc.d/init.d/nginx start起動後、Nginxで設定したドキュメントルート内に以下のPHPファイル(info.phpなど)を作成し、ブラウザからアクセスして動作確認を行います。
<?php
phpinfo();
?>画面が表示され、「Server API」の項目が 「FPM/FastCGI」 と表示されていれば、Nginx + PHP-FPMの連携は無事成功です!
Apache特有のハングアップにお悩みの方は、ぜひNginxの軽快な動作を体感してみてください。