Nginx + FPM の構成方法に関する記事はインターネット上にたくさんありますが、それらはどちらかというと運用の観点からのもので、その方法を説明していますが、なぜそれを行う必要があるのかについては説明しません。この記事は動作メカニズムから始まります。 Nginx と FPM の連携 Nginx と PHP がどのように連携するかを真に理解できるように、構成の背後にある原則を調べることから始めましょう。 Nginx と PHP がどのように連携するかを説明するには、まず CGI (Common Gateway Interface) と FastCGI という 2 つのプロトコルについて説明する必要があります。
CGI は Web サーバーとバックグラウンド言語間の対話用のプロトコルであり、このプロトコルを使用すると、開発者は任意の言語を使用して Web サーバーからのリクエストを処理し、コンテンツを動的に生成できます。しかし、CGI には致命的な欠点があります。それは、各リクエストを新しいプロセスにフォークする必要があるということです。Web の台頭により、高い同時実行性がますます標準になってきており、この非効率な方法では明らかに需要を満たすことができません。こうしてFastCGIが誕生し、やがてCGIは歴史の舞台から退いていきました。 FastCGI は、その名前が示すように、1 つのリクエストの処理後にプロセスを直接終了するのではなく、複数のリクエストを 1 つのプロセスで処理できるようにするもので、パフォーマンスが大幅に向上しました。
FPM (FastCGI Process Manager) については、FastCGI の実装であり、FastCGI プロトコルを実装する Web サーバーは FPM と通信できます。 FPM は、標準の FastCGI に対するいくつかの機能拡張も提供します。詳細については、公式ドキュメント「PHP: FPM インストール」を参照してください。
FPM は、マスター プロセスとワーカー プロセスを含む PHP プロセス マネージャーです。通常、複数のワーカー プロセス (特定の数は実際のニーズに基づいています。構成)、各プロセスには PHP インタプリタが組み込まれており、実際に PHP コードが実行される場所です。下の図は、私のローカル マシン上の fpm のプロセス状況です。マスター プロセス 1 つ、ワーカー プロセス 3 つです。 :
FPM から受信 リクエストが受信されて処理されるとき、具体的なプロセスは次のとおりです:
FPM のマスター プロセスがリクエストを受信します
マスター プロセスは、設定に従って特定のワーカー プロセスを割り当てます使用可能なプロセスがない場合は、リクエストを処理します。これが、Nginx を使用するときに 502 エラーが発生する理由でもあります。
ワーカープロセスはリクエストを処理し、タイムアウトになった場合は504エラーを返します
リクエストの処理が終了し、結果が返されます
FPM リクエストの受信から処理までのプロセスは次のようになりますでは、Nginx はどのようにリクエストを fpm に送信するのでしょうか?これはNginxレベルから説明する必要があります。
Nginx は Web サーバーであるだけでなく、http リクエストのプロキシに加えて、この記事の fpm に関連する fastcgi プロトコルなど、他の多くのプロトコル リクエストのプロキシとしても機能することがわかっています。 Nginx が fastcgi プロトコルを理解できるようにするために、Nginx は http リクエストを対応する fastcgi リクエストにマップする fastcgi モジュールを提供します。
Nginx の fastcgi モジュールは、主にこれらのマッピング関係を処理する fastcgi_param 命令を提供します。その主な役割は、Nginx の変数を PHP で理解できる変数に変換することです。
さらに、非常に重要なことは、fastcgi_pass コマンドです。このコマンドは、Nginx がすべての php リクエストを fastcgi リクエストに変換してリッスンするアドレスを指定するために使用されます。以下は、簡単に動作する Nginx 設定ファイルです:
この設定ファイルでは、ポート 80 でリッスンする新しい仮想ホストを作成します。Web ルート ディレクトリは /home/rf/projects/wordpress です。次に、location ディレクティブを使用して、.php で終わるすべてのリクエストを fastcgi モジュールに渡して処理します。これにより、すべての PHP リクエストが処理のために fpm に渡され、Nginx から fpm への閉ループが完了します。
これで、Nginx と FPM の間の通信プロセス全体がより明確になるはずです。
上
2016年4月2日北京
[注] この記事は知湖コラム http://zhuanlan.zhihu.com/p/20694204 で初公開されました