ホームページ >バックエンド開発 >PHPチュートリアル >PHP-FPMとNginx間の通信メカニズムの概要
PHP-FPM の概要
CGI プロトコルと FastCGI プロトコル
各動的言語 (PHP、Python など) に必要なコード ファイル.) 対応するパーサーを通じてサーバーによって認識され、インタープリターとサーバーが相互に通信できるようにするために CGI プロトコルが使用されます。サーバー上の PHP ファイルを解析するには、サーバーが PHP ファイルを解析できるように、PHP インタープリターを対応する CGI プロトコルと組み合わせて使用する必要があります。
CGI のメカニズムでは、リクエストごとに CGI プロセスをフォークし、リクエストが完了した後にプロセスを強制終了する必要があるため、実際のアプリケーションではリソースの無駄になります。そのため、CGI の改良版である FastCGI、処理後、プロセスは強制終了されず、複数のリクエストが処理され続けるため、効率が大幅に向上します。
PHP-FPMとは
PHP-FPMはPHP-FastCGI Process Managerであり、FastCGIの実装であり、プロセス管理機能を提供します。プロセスには、マスター プロセスとワーカー プロセスの 2 つのタイプが含まれます。マスター プロセスは 1 つだけあり、ポートをリッスンしてサーバーからリクエストを受信する役割を果たしますが、通常は複数のワーカー プロセスが存在します (特定の数は実際のプロセスに応じて構成されます)。 PHP インタープリターは、コードが実際に実行される場所です。
Nginx と php-fpm の通信メカニズム
Web サイト (www.test.com など) にアクセスすると、処理フローは次のとおりです。
www.test.com | | Nginx | | 路由到 www.test.com/index.php | | 加载 nginx 的 fast-cgi 模块 | | fast-cgi 监听 127.0.0.1:9000 地址 | | www.test.com/index.php 请求到达 127.0.0.1:9000 | | 等待处理...
Nginx と php-fpm の組み合わせ
Linux では、nginx と php-fpm 間の通信には、tcp ソケットと unix ソケットの 2 つの方法があります。
tcp ソケットの利点は、サーバーをまたがることができることです。この方法は、nginx と php-fpm が同じマシン上にない場合にのみ使用できます。
Unix ソケット (IPC (プロセス間通信) ソケットとも呼ばれる) は、同じホスト上でプロセス間通信を実装するために使用されます。この方法では、nginx 構成内の php-fpm のソケット ファイルの場所を入力する必要があります。ファイル。 。
2 つの方法のデータ送信プロセスを次の図に示します。
2 つの違い:
理由は Unix です。ソケットを通過する必要はありません。ネットワーク プロトコル スタックは、パッケージ化と解凍、チェックサムの計算、シーケンス番号と応答の維持などを行う必要がありません。アプリケーション層のデータをあるプロセスから別のプロセスにコピーするだけです。したがって、その効率は tcp ソケットよりも高く、不必要な tcp オーバーヘッドを削減できます。ただし、同時実行性が高い場合、UNIX ソケットは不安定になります。接続数が爆発的に増えると、大量の長期キャッシュが生成されます。接続指向プロトコルのサポートがないと、大きなデータ パケットがエラーを返さずに直接失敗する可能性があります。例外。 tcp などの接続指向のプロトコルを使用すると、通信の正確さと整合性をより確実に確保できます。
Nginx と php-fpm を組み合わせるには、それぞれの設定ファイルで設定を行うだけです。
1) Nginx での設定
tcp ソケット通信を例に挙げます。
server { listen 80; #监听 80 端口,接收http请求 server_name www.test.com; #就是网站地址 root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径 #路由到网站根目录 www.test.com 时候的处理 location / { index index.php; #跳转到 www.test.com/index.php autoindex on; } #当请求网站下 php 文件的时候,反向代理到 php-fpm location ~ \.php$ { include /usr/local/etc/nginx/fastcgi.conf; #加载 nginx 的 fastcgi 模块 fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 监听的 IP 地址和端口 # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式 } }
2) php-fpmの設定
listen = 127.0.0.1:9000 # 或者下面这样 listen = /var/run/php-fpm.sock
UNIXソケットメソッドを使用して接続する場合、ソケットファイルは本質的にfile には権限制御の問題があるため、nginx プロセスの権限と php-fpm の権限に注意する必要があります。そうしないと、許可なくアクセスするように求められます。 (各設定ファイルにユーザーを設定)
上記の設定でphp-fpmとnginx間の通信が完了します。アプリケーションでの選択
nginx と php-fpm が同じサーバー上で実行されており、同時実行性が高くない (1000 以下) 場合は、unix を選択します。ソケットを使用して、nginx と php-fpm 間の通信効率を向上させます。 高同時ビジネスに直面している場合は、負荷分散やカーネルの最適化などの運用および保守方法を通じて効率を維持するために、より信頼性の高い tcp ソケットの使用を検討してください。 同時実行性が高くても unix ソケットを使用したい場合は、次の方法で unix ソケットの安定性を向上させることができます。 1) sock ファイルを /dev/shm ディレクトリに配置します。sock ファイルをこのディレクトリのメモリに配置すると、メモリの読み書きが高速になります。 2) バックログを増やしますバックログのデフォルト ビット 128、1024、この値は通常の QPS に置き換えられます。設定は次のとおりです。 nginx.conf ファイルserver { listen 80 default backlog = 1024; }php-fpm.conf ファイル
listen.backlog = 10243) sock ファイルと php-fpm インスタンスを追加します/dev/shm に新しい sock ファイルを作成し、nginx のアップストリーム モジュールを通じて 2 つの sock ファイルへのリクエストの負荷を分散し、2 つの sock ファイルを 2 セットの php-fpm インスタンスにマップします。 個人的な概要です。間違っている点があれば修正してください~関連する推奨事項: "
PHP チュートリアル "
以上がPHP-FPMとNginx間の通信メカニズムの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。