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
が後に読まれたかな?