nginx + php-fpm で PHP だけ File not found. の時の対応


Amazon Linux 2 に nginx + php-fpm の構成を一から作った際に
nginx が php ファイルの時だけ File not found. と返してきて困ったので、
原因の調査方法をメモします。

尚、 nginx のエラーログに以下の出力がある前提です。

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, ...

考えられる原因

File not found. が表示される場合は多分以下のどちらか。

  • nginx の設定がおかしい。
    • SCRIPT_FILENAME, fastcgi_pass など
  • php-fpm の設定がおかしい。
    • 実行ユーザなど

確認する事、調査方法

nginx

document root 配下のディレクトリ、ファイルに対して nginx の読み込み権限がある前提。

  • index.html を document root に置いてみて、対応するリクエストで意図した内容が返って来るかどうか。 add_header ディレクティブを加えると意図したレスポンスヘッダが返ってくるかどうか。
  • ↑と同じディレクトリに index.php を置いて File not found. となるかどうか。
    • (↑php-fpm まで渡ってるけど php-fpm から指定の PHP ファイルが参照できていないという状態?)
  • 拡張子 .php に対する location ディレクティブの設定を確認してみる。
    • fastcgi_pass で指定したパスで php-fpm は待ち受けているか?
    • SCRIPT_FILENAME の値は合っているか?
      • root の値が /var/www/html/current/public の場合、 /var/www/html/current/public/index.php が存在するかどうか。

php-fpm

/etc/php-fpm.d/*.confaccess.log の指定がされている前提。

  • アクセスログで、 nginx の document root 以降のファイルパス (/index.php など) がリクエストされている事を確認。 (nginx → php-fpm の疎通が意図通り出来ているかどうか)
  • php-fpm の実行ユーザが意図した物になっているかどうか。 (php-fpm → PHP ファイルが出来ているかどうか)
    • user, group, または listen.owner, listen.group が nginx の実行ユーザ/グループになっているかどうか。
    • ps aux | grep php-fpm 等で実際に実行しているユーザを確認する。

今回の自分の場合は、 php-fpm の実行ユーザ/グループが nginx になっていなかった事が原因でした。
document root 配下を作成者または nginx グループしか読めないよう設定したのに対し
php-fpm 実行ユーザが nginx グループではなかったため、 php-fpm が PHP ファイルを読めなかったようです。

/etc/php-fpm.d/ 配下に www.confwww-override.conf を配置し、
www-override.confuser, groupnginx と指定していましたが、実際には www.conf の内容 (apache) が採用されていました。
ファイルを跨いでの同一 pool に対する設定の上書きが出来ると思ってたけど違ったみたい
もしくは www.conf が後に読まれたかな?