[関連する学習の推奨事項:php グラフィック チュートリアル]
各動的言語 (PHP、Python など) のコード ファイルは、対応するパーサーを渡す前に、これらはサーバーの識別になる可能性があり、CGI プロトコルはインタープリターとサーバーが相互に通信できるようにするために使用されます。サーバー上の PHP ファイルを解析するには、サーバーが PHP ファイルを解析できるように、PHP インタープリターを対応する CGI プロトコルと組み合わせて使用する必要があります。
CGI のメカニズムでは、リクエストごとに CGI プロセスをフォークし、リクエストが完了した後にプロセスを強制終了する必要があるため、実際のアプリケーションではリソースの無駄になります。そのため、CGI の改良版である FastCGI、 FastCGI がリクエストを実行します 処理後、プロセスは強制終了されず、複数のリクエストが処理され続けるため、効率が大幅に向上します。
PHP-FPMはPHP-FastCGI Process Managerであり、FastCGIを実装し、プロセス管理機能を提供します。プロセスには、マスター プロセスとワーカー プロセスの 2 つのタイプが含まれます。マスター プロセスは 1 つだけあり、ポートをリッスンしてサーバーからリクエストを受信する役割を果たしますが、通常は複数のワーカー プロセスが存在します (特定の数は実際のプロセスに応じて構成されます)。 PHP インタープリターは、コードが実際に実行される場所です。
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 チュートリアル]
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 ソケットを使用して接続する場合、ソケット ファイルは本質的にファイルであるため、権限制御の問題があるため、Pay が必要であることに注意してください。 nginx プロセスの権限と php-fpm の権限に注意してください。そうでないと、許可なくアクセスするように求められます。 (それぞれの設定ファイルにユーザーを設定します)
上記の設定でphp-fpmとnginx間の通信が完了します。
nginx と php-fpm が同じサーバー上で実行されており、同時実行性が高くない (1000 以下) 場合は、nginx との通信効率を向上させるために unix ソケットを選択してください。 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 = 1024
3) sock ファイルと php-fpm インスタンスを追加します
in/ を作成しますdev/shm に新しい sock ファイルを追加し、nginx の上流モジュールを介して 2 つの sock ファイルへのリクエストを負荷分散し、2 つの sock ファイルを 2 セットの php-fpm インスタンスにマップします。
以上がPHP-FPMとNginx間の通信メカニズムの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。