ウェブサイト検索

UNIX または TCP/IP ソケットを使用して NGINX を PHP-FPM に接続する方法


NGINX Web サーバー (リバース プロキシとして) は、(バックエンド アプリケーション サーバーとして) FastCGI プロトコルを通じて PHP アプリケーションにサービスを提供します。 NGINX は、代替の PHP FastCGI 実装である PHP-FPM (FastCGI Process Manager) を採用しており、デーモンとしてバックグラウンドで実行され、 >CGIリクエスト。負荷の高い Web サイトや Web アプリケーションを強化するために設計された追加機能が付属していますが、あらゆる規模のサイトに使用できます。

PHP-FPM は、FastCGI リソース プールの構成をサポートするだけでなく、FastCGI の内部機能の多くを改善し、エラー レポートやスクリプトを強化します。終了など。 PHP の悪魔化、プロセス管理、リクエストの送信元となるプロセスの動的な数、エラー ヘッダー、高速アップロードのサポートなどが特徴です。

NGINX からの FastCGI リクエストを受け入れるために、PHP-FPMTCP/IP ソケットまたは UNIX ドメインのいずれかをリッスンできます。ソケット。使用するアドレスを選択すると、NGINXfastcgi_pass ディレクティブを使用して PHP-FPM に接続 (プロキシ リクエスト) するために使用します。

このガイドでは、PHP-FPM を使用して PHP アプリケーションをサーバーするために NGINX を設定する方法について説明します。ここでは、NGINXPHP-FPM に接続するためにTCP/IP ソケットまたは UNIX ドメイン ソケットを使用するタイミングとその理由について説明します。

このガイドは、Linux システムにNGINXPHP-FPM がインストールされていることを前提としています。それ以外の場合は、以下を参照してください。

  • CentOS 8 に LEMP サーバーをインストールする方法
  • LEMP スタック PhpMyAdmin を Ubuntu 20.04 サーバーにインストールする方法
  • NGINX、MySQL/MariaDB、および PHP を RHEL 8 にインストールする方法
  • Debian 10 サーバーに LEMP をインストールする方法

UNIX ドメイン ソケットと TCP/IP ソケットのどちらを使用すればよいですか?

UNIX ドメイン (または IPC) ソケットは、TCP を使用しながら、同じオペレーティング システム上で実行されているプロセス間で効率的なデータ交換を可能にするプロセス間通信 (IPC) の手段です。 /IP (またはインターネット ドメイン) ソケットを使用すると、プロセスがネットワーク経由で通信できるようになります。

IP アドレスとポート (127.0.0.1:9000 など) でサーバーを識別する TCP/IP ソケットとは異なり、次を使用してサーバーを UNIX ドメイン ソケットにバインドできます。ファイルシステムに表示されるファイルパス名 (例: /run/php-fpm/www.sock)。

UNIX ドメイン ソケットは特別なタイプのファイルです。ファイルとディレクトリのアクセス許可がそれに適用され (他のタイプの UNIX ファイルの場合と同様)、ホスト上のどのプロセスがファイルに対して読み書きできるかを制限するために使用できます。 (したがって、バックエンドサーバーと通信します)。

このようにすると、ローカル ホスト上のプロセスのみが UNIX ドメイン ソケットを使用できるため、UNIX ドメイン ソケットは安全になります。ファイアウォールなどの追加のセキュリティ対策が実装されていない限り、TCP/IP ソケットがインターネットに公開される可能性があり、セキュリティ リスクが生じます。

重要なのは、UNIX ドメイン ソケットの使用は、 パフォーマンスに関してTCP/IP ソケットを使用するのと同じではなく、いくつかのテストとベンチマークで UNIX ドメイン ソケットの方が高速であることが証明されているということです。 UNIX ドメイン ソケットの主な欠点は、拡張性が低く、同じオペレーティング システム (OS) 内のプロセス間通信のみをサポートすることです。

PHP-FPM リッスン アドレスはどこで設定できますか?

PHP-FPM がリッスンするアドレスは、リソース プール構成ファイルで構成できます。 PHP-FPM を使用すると、異なる設定でプロセスの複数のプールを実行できることに注意してください。デフォルトのプールは www と呼ばれます。

リソース プール構成ファイルの場所は、PHPPHP-FPM が Linux システムにインストールされる方法 (デフォルト/単一バージョンか、複数のバージョンを同時にインストールするか) によって異なります。 。

たとえば、単一バージョンの CentOS 8 では、すべての PHP 設定ファイルは /etc ディレクトリとデフォルトの PHP-FPM に配置されます。プール (www) 構成ファイルは /etc/php-fpm.d/www.conf です。

すべての PHP 構成ファイルをリストするには、次の ls コマンドを使用します。

ls /etc/php*

Ubuntu 20.04 では、PHP 設定ファイルは /etc/php// ディレクトリとデフォルトの PHP-FPM にあります。 > プール (www) 構成ファイルは /etc/php//fpm/pool.d/www.conf です。

ls /etc/php/7.4/

UNIX ドメイン ソケットでリッスンするように PHP-FPM を設定する

UNIX ドメイン ソケットでリッスンするように PHP-FPM を設定するには、お気に入りのテキスト エディタを使用して、デフォルトのPHP-FPM プール設定ファイルを開きます。

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

次に、listen ディレクティブを探し、次のように UNIX ドメイン ソケットのファイル パス名に設定します。ほとんどのインストールでは、デフォルトで UNIX ドメイン ソケットが使用されることに注意してください。

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

UNIX ドメイン ソケットを使用する場合は、NGINX Web サーバーからの接続を許可するために、ファイルに適切な読み取り/書き込み権限を設定する必要もあります。デフォルトでは、NGINX は CentOS/RHEL/Fedora ではユーザーおよびグループ nginx として実行され、Ubuntu では www-data として実行されます。そしてデビアンです。

したがって、listen.owner パラメータと listen.group パラメータを見つけて、それに応じて設定します。また、listen.mode パラメータを使用してモードを 0660 に設定します。

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

UNIX ドメイン ソケット ファイルのアクセス許可が正しく設定されていない場合、NGINX は不正なゲートウェイ エラーを返す可能性があることに注意してください。

TCP/IP ソケットでリッスンするように PHP-FPM を構成する

UNIX ドメイン ソケットは TCP/IP ソケットよりも高速ですが、前者は同じ OS 上のプロセス間通信しかサポートできないため、スケーラビリティに劣ります。 NGINX とバックエンド アプリケーション サーバー (PHP-FPM) が異なるシステムで実行されている場合は、PHP-FPM をリッスンするように設定する必要があります。接続用の TCP/IP ソケット。

PHP-FPM プール構成ファイルで、listen アドレスを次のように設定します。選択したポートが同じシステム上の別のプロセスまたはサービスによって使用されていないことを確認してください。

listen = 127.0.0.1:3000

PHP-FPM アプリケーション サーバーと連携するための NGINX の構成

PHP-FPM がリッスンするアドレスを設定したら、fastcgi_pass を使用して、そのアドレス経由でリクエストをプロキシするように NGINX を設定する必要があります。仮想サーバーブロック構成ファイル内の構成パラメータ。

たとえば、Web サイトの設定ファイルが /etc/nginx/conf.d/example.com.conf の場合、編集のために開きます。

vim /etc/nginx/conf.d/example.com.conf 

UNIX でリッスンするように PHP-FPM を設定した場合は、.php ファイルを処理するための location ブロックを探し、fastcgi_pass パラメータを次のように設定します。ドメインソケット。

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

または、TCP/IP ソケットでリッスンするように PHP-FPM を設定した場合は、TCP/IP アドレスを使用します。バックエンド アプリケーション サーバー (PHP-FPM) が別のサーバーで実行されている場合 (10.42.0.10 を、PHP-FPM FastCGI サーバーが配置されているマシンの IP アドレスに置き換えます)が走っています)。

fastcgi_pass  10.42.0.10:3000;

重要: CentOS 8 では、PHP-FPM/ etc/nginx/conf.d/php-fpm.conf ファイルは、上流ブロック内にあり、php-fpm という名前が付いています。

プール設定ファイルでPHP-FPM がリッスンするように設定されているアドレスに応じて、ここで変更を加えることができます。デフォルト設定は UNIX ドメインソケットを指します。

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

サイトのサーバー ブロック ファイルで、次のように fastcgi_pass パラメータを設定するだけです。

fastcgi_pass php-fpm;

PHP-FPM および NGINX 構成を変更した後、次のように構成構文が正しいかどうかを確認してください。

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

コマンド出力にはメインの構成ファイルのみが表示されますが、他のすべての構成ファイルも含まれており、同様にチェックされます。

次に、systemctl コマンドを使用して、2 つのサービスを再起動して変更を適用する必要があります。

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

エラーが発生した場合は、cat コマンドを使用して NGINX および PHP-FPM ログ ファイルを確認できます。

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

私たちがあなたに用意したものはこれですべてです。以下のコメントセクションを使用して質問できます。詳細については、NGINX ドキュメントおよび PHP-FPM ドキュメントを参照してください。