nginx+php-fpmでphpのソースがそのまま表示されてしまうとき確認すること

nginx+php-fpmで、WordPress環境を作る必要があったけど、何度ブラウザでアクセスしても

<?php phpinfo(); ?>

がそのまま表示されてしまう。

いったいどういうことなのか、ググっても海外ですらいい解決法の情報はない。そもそもnginxで検索してるのにapacheの話ばっかり出てくる。もう土下座するしかないと諦めていたそのころ…しょーーーもない原因が判明したのであった。

みんなが同じ原因で10時間も悩まないように、ここにその原因を備忘録として残しておきます。

それは、locationの優先順位でした。




問題のnginx.conf

listen 80;
client_max_body_size 2G;
server_name xxx.xxx.xxx.xxx;
keepalive_timeout 5;
root /var/www/wp;

location ^~ / {
  index index.php index.html;
  try_files $uri $uri/ /index.php?$args;
  include /etc/nginx/mime.types;
}

location ~ \.php$ {
  fastcgi_pass unix:/var/run/php-fpm/www.sock;
  fastcgi_index index.php;
  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
}

こちらが問題のソース。

結論からいうと、7行目を

location  /

に直したら正常に動作するようになりました。

原因は?

原因は、正規表現の記述ミス

locationの正規表現は、以下のような種類があります。

プレフィックス 説明
なし 前方一致
^~ 前方一致。一致したら、正規表現の条件を評価しない。
= 完全一致。パスが等しい場合。
~ 正規表現(大文字・小文字を区別する)
~* 正規表現(大文字・小文字を区別しない)

locationにプレフィックスをつけた場合、設定同士で優先順位が発生します。

/var/www/wp/index.phpというロケーションにアクセスした場合、まずindex.phpをphpとしてnginxで動作させたいので、本当は”location ~ \.php$”にある設定を最優先しなきゃいけないのに、それより前の”location ^~ /”の設定を読んでしまった時点で評価が終わるため、拡張子phpに対する設定が無視されていた

ずっと必死にphp-fpmとnginxの通信ができていないんじゃないかと予測して調査していましたが、そもそもここの設定部分が無視されているので、何をやっても何も起きていなかったんですね。エラーも出ません。

いやー怖かった…

みんなも凡ミスには気をつけようね。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です