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/*.conf で access.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.conf と www-override.conf を配置し、
www-override.conf で user, group を nginx と指定していましたが、実際には www.conf の内容 (apache) が採用されていました。
ファイルを跨いでの同一 pool に対する設定の上書きが出来ると思ってたけど違ったみたい ![]()
もしくは www.conf が後に読まれたかな?