php-fpm&nginx

  • 投稿者:
  • 投稿カテゴリー:nginx / PHP

php-fpm

fpm(FastCGI Process Manager)は、php-cgiのプロセス管理ができる
PHP5.4.0から公式サポートされており、ロングサポートが期待できる

できること

・緩やかな (graceful) 停止/起動 機能を含む高度なプロセス管理
・異なる uid/gid/chroot/environment でのワーカーの開始、 異なるポートでのリスン、異なる php.ini の使用 (safe_mode の代替)
・標準出力および標準エラー出力へのログ出力
・opcode キャッシュが壊れた場合の緊急再起動
・”slowlog” – 非常に低速に動作するログ出力スクリプト (名前から想像される内容だけでなく、ptrace やそれと同等の仕組みを使ってリモートプロセスの execute_data からの PHP バックトレースも出力します)
・動的/静的 な子プロセスの起動
・基本的な SAPI の動作状況 (Apache の mod_status と同等)
・fastcgi_finish_request() – リクエストを終わらせてすべてのデータを出力した後で 何か時間のかかる処理 (動画の変換や統計情報の処理など) をさせるための特殊な関数

インストールと簡単な操作

root@akat:/home/akat# uname -a
Linux www27032ue 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
root@akat:/home/akat# aptitude install php5-fpm
…中略
root@akat:/home/akat# php5-fpm -v
PHP 5.4.4-14+deb7u7 (fpm-fcgi) (built: Dec 12 2013 08:42:33)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
root@akat:/home/akat# php5-fpm -i # PHP情報や設定を表示
phpinfo()
PHP Version => 5.4.4-14+deb7u7

System => Linux www27032ue 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64
Build Date => Dec 12 2013 08:40:58
Server API => FPM/FastCGI
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc/php5/fpm
Loaded Configuration File => /etc/php5/fpm/php.ini
…中略
root@akat:/home/akat# php5-fpm -m # コンパイルされたモジュール表示
[PHP Modules]
bcmath
bz2
calendar
cgi-fcgi
Core
ctype
date
…中略
root@www27032ue:/home/shimizu# php5-fpm -t # 設定ファイルの確認
[11-Feb-2014 20:03:49] NOTICE: configuration file /etc/php5/fpm/php-fpm.conf test is successful

設定ファイル-/etc/php5/fpm/php-fpm.conf

pid = /var/run/php5-fpm.pid

pidファイル

emergency_restart_threshold、emergency_restart_interval

emergency_restart_threshold個以上の子プロセスが、emergency_restart_intervalの間にSIGSEGVもしくはSIGBUSとなったときFPMは再起動する
0としたときは、無効であることを表す。デフォルトは無効

process_control_timeout

子プロセスがmasterからのSIGNALを待つ最大時間
秒数、分、時間、日で指定することとが可能

process.max

FPMがフォークする最大プロセス数
多くのプールを利用してdynamic PMを使うとき、プロセスをコントロールする設定となる
デフォルトは0で、制限なし

process.priority

masterプロセスのナイス値を設定する
-19 (もっとも優先度高い) to 20(もっとも優先度が低い)を設定でき、デフォルトは設定していない

daemonize

FPM をバックグラウンドに送る。デバックするためにはnoとするべし

rlimit_files

masterプロセスのオープンできるファイルディスクリプタ数を指定する
デフォルトはシステムの規定値

rlimit_core

masterプロセスのコアサイズの制限を指定する
指定できるのは、unlimited、もしくは0以上の整数
デフォルトはシステムの規定値

events.mechanism

FPMの内部メカニズムを選択する
デフォルトは自動で選択する
linuxはepollがよい

設定ファイル-/etc/php5/fpm/pool.d/www.conf

概要

子プロセスの管理するプールはそれぞれ別のポートや設定で起動することが可能
php.iniの上書きすることもできる
プール名はlogやstatsに利用される、またプールの数に制限はない

[www]

pool名を指定する
変数$poolはここで指定する

user,group

プロセスを所有するユーザとグループ

listen

FastCGIリクエストを待ち受けるポートやソケットを設定する
例:
listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000

listen.backlog★

listen(2) のbacklogの設定。デフォルト128

listen.owner,listen.group,listen.mode

Unixソケットを利用するときのownユーザやパーミッションを指定する

listen.allowed_clients

FastCGIクライアントの接続をIP制限する
アドレスはカンマ区切りで指定し、デフォルトはすべての接続を受け付ける

priority

poolプロセスのナイス値を設定する
-19 (もっとも優先度高い) to 20(もっとも優先度が低い)を設定でき、デフォルトは設定していない

pm

子プロセスの管理方法を指定する
static,dynamic,ondemandから選択可能

pm.status_path

FPMのstatusを閲覧できるURIを指定する
pool名などの設定から現在の接続数など確認可能

通常テキストで一部情報だけ表示されるが、
http://www.foo.bar/status?html&full
など指定することで、htmlファイルですべての情報を表示させることが可能

ping.response

pingリクエストのレスポンスをカスタマイズ可能
レスポンスコード200のtext/plain形式でフォーマットされている
デフォルトはpong

access.log,access.format

アクセスログとフォーマットを設定する
デフォルトはアクセスログは出力しない
フォーマットは”%R – %u %t \”%m %r\” %s”

slowlog,request_slowlog_timeout

スローログとその秒数を指定する
request_slowlog_timeoutを0sとすると、無効となる

request_terminate_timeout

ひとつのリクエストを処理する最大の時間。これを超えると、killする
php.iniにてmax_execution_timeで制御できない場合があるときに利用するべし
デフォルトは0で無効

rlimit_files

masterプロセスのオープンできるファイルディスクリプタ数を指定する
デフォルトはシステムの規定値

rlimit_core

コアサイズの制限を指定する
指定できるのは、unlimited、もしくは0以上の整数
デフォルトはシステムの規定値

chroot

このディレクトリのchroot開始位置を決める。絶対パスで指定する

chdir

このディレクトリのchdir開始位置を決める。絶対パスで指定する

catch_workers_output

ワーカーの標準出力および標準エラー出力をエラーログにリダイレクトするかどうか
デフォルトでは出力しない

security.limit_extensions

FPMがパースする拡張子を制限する
デフォルトは.php

bugfix

http://ankyo.blog.so-net.ne.jp/2012-02-12

http://tech.aainc.co.jp/archives/3022

nginxとの連携

インストール

root@akat:/home/akat# aptitude install nginx
以下の新規パッケージがインストールされます:
  nginx nginx-common{a} nginx-full{a}
更新: 0 個、新規インストール: 3 個、削除: 0 個、保留: 1 個。
アーカイブ 570 k バイト中 0  バイトを取得する必要があります。展開後に 1,234 k バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] y
以前に未選択のパッケージ nginx-common を選択しています。
(データベースを読み込んでいます ... 現在 62345 個のファイルとディレクトリがインストールされています。)
(.../nginx-common_1.2.1-2.2+wheezy2_all.deb から) nginx-common を展開しています...
以前に未選択のパッケージ nginx-full を選択しています。
(.../nginx-full_1.2.1-2.2+wheezy2_amd64.deb から) nginx-full を展開しています...
以前に未選択のパッケージ nginx を選択しています。
(.../nginx_1.2.1-2.2+wheezy2_all.deb から) nginx を展開しています...
man-db のトリガを処理しています ...
nginx-common (1.2.1-2.2+wheezy2) を設定しています ...
nginx-full (1.2.1-2.2+wheezy2) を設定しています ...
nginx (1.2.1-2.2+wheezy2) を設定しています ...

設定-php-fpm

root@akat:/home/akat# vi /etc/php5/fpm/pool.d/www.conf
===
listen = 127.0.0.1:9000 # 追加する
===

設定-nginx

root@akat:/home/akat# vi /etc/nginx/sites-enabled/default
=======
server {
        root /var/www/htdocs;
        index index.html index.htm;

        server_name tech.akat.info;

        location / {
                try_files $uri $uri/ /index.html;
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        location /nginx_status {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            deny all;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000; # FastCGIサーバを指定、upstreamブロックを利用することも可能
                include fastcgi_params;
        }
}
=======
root@akat:/home/akat# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@www27032ue:/etc/nginx/sites-enabled# /etc/init.d/nginx restart
Restarting nginx: nginx.

nginx_statusにアクセスしたとき

root@akat:/etc/nginx# curl http://localhost/nginx_status
Active connections: 1
server accepts handled requests
 4 4 7
Reading: 0 Writing: 1 Waiting: 0

おまけ

        default_type "text/html; charset=utf-8";
        echo "$variable";

を設定ファイルに記載することで、変数を確認可能

確認事項

portよりもunix socketが早い?
http://dogmap.jp/2013/04/16/sakura-vps-performance-tuning/
http://blog.scratchpad.jp/nginx-optimize/
http://blog.kubox.info/2011/07/nginxphp-fpm.html

参考

http://www.php.net/manual/ja/install.fpm.php
http://php.net/manual/ja/install.fpm.configuration.php
http://server-setting.info/centos/apache-nginx-9-sakura-vps.html
http://server-setting.info/debian/apache-mod_fastcgi-php-fpm-debian.html