かえでBlog

色々なことを徒然と……

nginx+php-fpmのインストール

      2015/05/18

現在のサーバーはApacheのpreforkで動かしています。

新サーバーはApacheのwokerで設定していたのですが、負荷テストでよくハングアップし、再起動しないと動かない状態まで陥っていました。

設定を変えてもなかなか……ということだったのでいい機会だしnginxを初導入してみました。

まずは最新のnginxをこちらからダウンロードします。

私はyumでインストールができるように下記のrpmをダウンロードし、インストールしました。

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

インストールができたらyum listでnginxが最新になっているか確認します。
2013年4月10日時点で1.2.8が最新です。

yum list nginx
nginx.x86_64                       1.2.8-1.el6.ngx                        @nginx

確認ができたらインストールをします。

yum install nginx

これでnginxのインストールは終了です。phpの設定も同時に行いたいので、設定は後述します。

nginxでphpを動かすためにphp-fpmとspawn-fcgiをインストールします。ここでは既にPHPの設定ができている前提で説明しています。

yum install php-fpm spawn-fcgi

php-fpmの設定をします。(ソース内は抜粋 詳しく知りたい方はこちら

vim /etc/php-fpm.d/www.conf
#9000ポートで動かします。
listen = 127.0.0.1:9000

#ユーザーとグループの設定です。Apacheで動かしてたのでapacheで設定しています。
user = apache
group = apache

#プロセスマネージャが子プロセスの数を制御する方法を選択します。
#static - 子プロセスの数は固定 (pm.max_children) です。
#ondemand - プロセスを必要に応じて立ち上げます。 dynamic とは対照的に、リクエストされると pm.start_servers で指定しただけサービスを開始します。
#dynamic - 子プロセスの数は、 pm.max_children、pm.start_servers、 pm.min_spare_servers、pm.max_spare_servers の内容に基づいて動的に設定されます。
#staticは固定値でメモリを保有するので処理は上がります。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にするか…子プロセスをどれくらい立ち上げるかによって変わってきます。 負荷をかけてみたりして最適な数値を見つけてください。 次にnginxの設定にうつります。詳しく知りたい方はこちら
vim /etc/nginx/nginx.conf
#Apacheで実行していたのでUserをApacheにしています。
user  apache;

#worker_processesはnginxがHTTPを処理するプロセス数、worker_cpu_affinityはどのCPUに割り当てるかを設定します。
worker_processes  3;

#▼以下追加▼
#CPUのコア数=2進数の桁数 重複OK 1はCPUを使う位置だと思ってくれたらいいかな…
worker_cpu_affinity 001 010 100;
#2コアだと 01 10 10 と1つのコアに2プロセス使います
#4コアだと 0001 0010 0100 1000の内三つを記述します。
#▲ここまで追加▲

#worker_connectionsは1つのプロセスあたりの接続数を記載します。
events {
     worker_connections  1024;
}

#keepalive_timeoutの設定をします。動的サーバーなら短め、静的サーバーなら長めがいいようです。  
    keepalive_timeout  10;

#gzip圧縮を行います。
#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format deflate '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"';
#    access_log  /var/log/nginx/access.log  main;
    access_log  /var/log/nginx/access.log  main;

    gzip              on;
#▼以下追加▼
    gzip_http_version 1.0;
    gzip_types        text/plain 
                      text/html 
                      text/xml 
                      text/css 
                      application/xml 
                      application/xhtml+xml 
                      application/rss+xml 
                      application/atom_xml 
                      application/javascript 
                      application/x-javascript 
                      application/x-httpd-php;
    gzip_disable      "MSIE [1-6]\.";
    gzip_disable      "Mozilla/4";
    gzip_comp_level   1;
    gzip_proxied      any;
    gzip_vary         on;
    gzip_buffers      4 8k;
    gzip_min_length   1100;
#▲ここまで追加▲

conf.d内のdefault.confを修正します。

vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    #サーバー名の変更
    server_name  example.jp;

    #charset koi8-r;
    access_log  /var/log/nginx/log/access.log  main;
    error_log /var/log/nginx/log/error.log;
    location / {
        #rootは表示するディレクトリ(ドキュメントルート)です
        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を使えるようにします。
    location ~ \.php$ {
        #rootは表示するディレクトリ(ドキュメントルート)です
        root   /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
#wordpressではパーマリンク等.htaccessが使われているのですがnginxは読み込みません。
#アクセスすると中身が表示してしますので表示しないようにします。
    location ~ /\.ht {
        deny  all;
    }


最後にphp-fpmとnginxを起動します

/etc/rc.d/init.d/php-fpm start
/etc/rc.d/init.d/nginx start
これでnginxにて指定したURLにアクセスすると動くと思います。 phpの情報は
<?php
     phpinfo();
?>
Server API FPM/FastCGI と表示されてたらOKです。

 - サーバー , , , ,