技術・開発

Apacheから移行!Nginx + PHP-FPMのインストールとチューニング設定手順(CentOS)

2013年4月23日

現在のサーバーは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-fcgi

php-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の軽快な動作を体感してみてください。

-技術・開発
-, , , , , , ,