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 プロセス マネージャーです。マスター プロセスは 1 つだけあり、ポートをリッスンして Web サーバーからリクエストを受信する役割を果たしますが、通常は複数のワーカー プロセス (特定の数) が存在します。実際のニーズに基づく構成)、各プロセスには PHP インタプリタが埋め込まれており、ここで PHP コードが実際に実行されます。以下の図は、私のローカル マシン上の fpm のプロセス状況、1 つのマスター プロセスと 3 つのワーカー プロセスです。
FPMからリクエストを受け取り、処理が完了した後の具体的なプロセスは以下の通りです:
FPMのマスタープロセスがリクエストを受け取ります
マスタープロセスは、使用可能な process がない場合は、リクエストを処理するための設定がエラーを返します。これが、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 の間の通信プロセス全体がより明確になるはずです。
関連する推奨事項:
Linux での PHP 環境のインストールと、php-fpm モジュールをサポートするように Nginx を構成する方法の詳細な紹介 (画像とテキスト)
実行中の PHP-FPM のリアルタイム表示と監視の詳細な説明ステータス
phpはphp-fpmを使用して操作コマンドの再起動と停止を行います
以上がNginxとFPMの動作メカニズムの例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。