nginxについて学習してきましたが、今回はphp-fpmについてです。
Contents
そもそもの構成
以前、nginxにも書きましたが、nginx自体はPHPを処理することはできないので、代わりにPHPを処理するソフトウェアが必要になってきます。
ざっくり示すと下記のような流れになるようです。
- nginxがリクエストをうけとる
- nginx→php-fpmに処理を流す
- php-fpmが処理をし、nginxに処理を変える
- nginxからユーザーにレスポンスを返す
KoaでWeb開発: Koaの検証を通じてミドルウェアの概念を理解する
PHPをApacheで処理する場合、mod_phpを用いて動作させるのが一般的でしたが、最近はphp-fpmが注目されています。
php-fpmはFastCGI形式で動作するPHPサーバーで、従来のApacheに任せたプロセス管理とはことなり、独自のプロセス管理を実装しています。PHP5.3.3以降はPHP自体に標準搭載されているようです。
CGIのメカニズム
そもそものWebサーバーの目的はクライアントからの要求に対して記憶装置に格納されているファイルを送り返すことです。
最初は静的なファイルが中心でしたが、現在では動的なファイルのやりとりをすることが一般的になりました。こういった動的なファイルの処理を行うために考え出されたプロトコルがCGI(Common Gate Interface)です。
しかし、下記のような問題点もありました。
- 個々の要求ごとに別々のプロセスが起動されるため、メモリや各種コンテキスト情報は、要求ごとに失われてします。
- プロセスの起動により、システムのリソースを大きく消費し、サーバーを圧迫する
- Webサーバーとアプリケーションが別々のコンピューターで実行されるアーキテクチャはちょいムズイ
FastCGI
上記のような問題があるため、FastCGIという仕組みが考え出されました。
主に下記のようなメリットがあります。
- 要求ごとにプロセスを起動するのではなく、複数の要求を処理することのできる永続プロセスを使う
- Webサーバーとアプリケーションをソケット通信させることで、ネットワーク上の2つのコンピューター上で実行できる
- ソケットベースのプロトコルなため、任意のプログラミング言語で任意のプラットフォーム上に実装できる
Nginx入門 P185~205
nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する
ネットワークがらみになるとようわからん・・・
この仕組みを通してnginxはPHPを処理しています。phpを直接処理するのはphp-fpmになることが多いでしょう。
php-fpmについて
nginxでの設定に関して
まずnginxでphp-fpmが記載される場合どのように書かれるかを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
location ~ \.php$ { #ルートディレクトリ root /var/www/html/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_buffers 8 256k; fastcgi_buffer_size 256k; fastcgi_send_timeout 1800; fastcgi_read_timeout 1800; fastcgi_connect_timeout 1800; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; include fastcgi_params; } |
一般的に使われるディレクティブを見ていきましょう。
fastcgi_pass
FastCGIに処理が渡されるポートを記します。
phpの場合は 127.0.0.1:9000(TCP) か
unix:/var/run/php-fpm/php-fpm.sock(unixソケット通信) のどちらかが選択されることが多いようです。
違いは下記参照
調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話
TCPソケット通信で処理を行う場合は fastcgi host:port(今回はこのケース)のように書かれることが一般的です。
fastcgi_index
FastCGIサーバーは自動インデックス付与をサポートしていない。そこで、要求されたURIの末尾が/ならNginxがfastcgi_indexの値を末尾にサポートする
fastcgi_param
FastCGIに渡される要求をkey=value形式で設定します。全てのFASTCGI要求で必ずSCRIPT_NAMEとQUERY_STRINGの2つの引数が必要になります。
SCRIPT_FILENAMEは直接実行されるプログラムです。もし値を見たい場合は$document_rootやfastcgi_script_nameをデバッグしてみてみるとよいでしょう。
(例
$document_root = 'var/www/html/' $fast_cgi_script_name ='public/sample.php' )