ホームページ  >  記事  >  バックエンド開発  >  Nginx と php-fpm 間の通信メカニズムについて説明し、その構成方法を見てみましょう。

Nginx と php-fpm 間の通信メカニズムについて説明し、その構成方法を見てみましょう。

青灯夜游
青灯夜游転載
2022-03-08 10:38:175963ブラウズ

この記事では、Nginx と php-fpm の間の通信メカニズムについて説明し、2 つの通信方法の違いを紹介し、Nginx と php-fpm の組み合わせを構成する方法を確認し、環境で通信方法を選択する方法を分析します。皆さんのお役に立てれば幸いです!

Nginx と php-fpm 間の通信メカニズムについて説明し、その構成方法を見てみましょう。

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 間の通信には 2 つの方法があります: tcp ソケットと unix ソケットです。

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 ソケットを使用して接続する場合、ソケット ファイルは本質的にファイルであるため、アクセス許可制御の問題が発生することに注意してください。 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 ビデオ チュートリアル

以上がNginx と php-fpm 間の通信メカニズムについて説明し、その構成方法を見てみましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。