Nginx PHP-FPMプロキシ設定

NginxでFastCGIプロトコルを使用してPHPファイルをPHP-FPMで処理する設定方法を解説。Unixソケット vs TCP接続、セキュリティ強化、キャッシュに対応。

Proxy

詳細な説明

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リクエストを転送して処理する必要があります。

Try It — Nginx Config Generator

フルツールを開く