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