Nginx PHP-FPMプロキシ設定
NginxでFastCGIプロトコルを使用してPHPファイルをPHP-FPMで処理する設定方法を解説。Unixソケット vs TCP接続、セキュリティ強化、キャッシュに対応。
詳細な説明
NginxはPHPをネイティブに処理しません。代わりに、FastCGIプロトコルを使用してPHPリクエストをPHP-FPM(FastCGI Process Manager)に転送します。このアーキテクチャの分離により、Apacheの組み込みmod_phpアプローチと比べてパフォーマンスとセキュリティが向上します。
基本的なPHP-FPM設定
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
ソケット vs TCP
PHP-FPMはUnixソケットまたはTCPポートでリッスンできます。Unixソケットは同一マシン上の通信でTCP/IPネットワークスタック全体をバイパスするため高速です。TCPはPHP-FPMが別サーバーや別のDockerコンテナで実行されている場合に必要です。
# Unixソケット(同一マシン、低遅延)
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
# TCP(リモートサーバーまたはDockerコンテナ)
fastcgi_pass 127.0.0.1:9000;
セキュリティ:任意のファイル実行の防止
重要なセキュリティ対策として、存在しないPHPファイルへのリクエストをPHP-FPMに渡さないようにします。パストラバーサル攻撃を防止します:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
try_files $uri =404 により、ファイルがディスク上に実際に存在する場合にのみPHP-FPMにリクエストが渡されます。
FastCGIキャッシュ
Nginxは頻繁にアクセスされるページのPHP-FPMレスポンスをキャッシュし、PHP処理負荷を大幅に削減できます:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:10m max_size=1g;
location ~ \.php$ {
fastcgi_cache phpcache;
fastcgi_cache_valid 200 5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
}
機密ファイルへの直接アクセスの拒否
設定ファイル、ドットファイル、その他クライアントに直接配信すべきでない機密リソースへのアクセスをブロックします:
location ~ /\. { deny all; }
location ~ /(wp-config|config)\.php$ { deny all; }
これにより、データベースの資格情報やAPIキーなどが含まれるファイルの読み取りを防ぎます。
ユースケース
WordPress、Laravel、DrupalなどのPHPアプリケーションをデプロイし、NginxからPHP-FPMにPHPリクエストを転送して処理する必要があります。