Syntax Error.

[Sy] 【解決した】HomebrewでNginx + php-fpmの環境を作ろうとしたらPHPファイルがダウンロードされる

2016/07/06

Macbook Pro を最近新調したので、Nginx + php-fpm の環境を作ろうとしたら、設定をいくらいじってもPHPファイルがダウンロードされてしまうという感じでハマりました。同じ理由でハマった記事が見つからずに苦労したのでメモしておきます。まさかあいつが犯人とは・・・

環境

  • Mac OS X / 10.11.5 (El Capitan)
  • Homebrew / 0.9.9
  • Nginx / 1.10.1
  • PHP / 5.6.23
  • Chrome / 51.0.2704.103

現象と経緯

  1. 普通に Homebrew 経由で Nginx と PHP をインストール。
  2. ドキュメントルートにindex.phpを適当に作成。
  3. 一旦ブラウザでindex.phpにアクセスして、ファイルがダウンロードされる。久々の php-fpm の設定だったので、この時は「そっかそっか。nginx.confいじらないとねー。忘れてた。」的な感じでまだ余裕かましてた。
  4. nginx.confphp-fpm.conf の設定を変更。
  5. 再度 index.phpにアクセス。まだPHPが実行できず。
  6. 何度か4と5を繰り返す。予定外のハマりに焦る。

みたいな感じです。

PHP5.6のインストールとphp-fpmの設定については以下に書きました。

⇒ [Sy] Mac(El Capitan)にPHP5.6とかPHP7をインストールして使えるようにする手順

原因と解決方法

結局、以下2つが原因となっていてハマってました。

原因1:nginx.confの設定をミスってた

Homebrew でインストールされる Nginx のデフォルトの nginx.conf には、以下のようなphp-fpm用の設定がコメントアウトされています。

http {
  ・
  ・
  server {
    ・
    ・
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    # location ~ \.php$ {
    #     root           html;
    #     fastcgi_pass   127.0.0.1:9000;
    #     fastcgi_index  index.php;
    #     fastcgi_param  SCRIPT_FILENAME  /script$fastcgi_script_name;
    #     include        fastcgi_params;
    # }
  }
}

これを、最初以下のように変更していました。

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {                              <-- ↓コメント解除 ここから
        root           /xxx/xxx/xxx;                 <-- ドキュメントルートの変更
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /script$fastcgi_script_name;
        include        fastcgi_params;
    }                                                <-- ↑コメント解除 ここまで
原因1の解決方法

「ここをコメント解除すればいいんだよね。あ、ドキュメントルート変更しなきゃね。」とささっと修正しましたが、1箇所変更が漏れてました。。。

fastcgi_param  SCRIPT_FILENAME  /script$fastcgi_script_name;

 ↓

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

原因1はこれでOKです。

そして、強敵だったのがもう一つの原因。。。

原因2:ChromeがPHPファイルをダウンロードした時の誤ったキャッシュを持ち続けていた

はい。そういうことでした。 最近のChromeは、例えばリダイレクトのキャッシュをずっと持ち続けたり、ちょいちょい他のブラウザよりも強力なキャッシュの実装になっていて開発時に困ったことがこれまでも何度かありました。

今回もそれが原因で、いくらnginx.confを修正しても、最初index.phpにアクセスした時にダウンロードされた時のキャッシュをChromeが持ち続けていて、原因がわかりづらくなっていたんですね。なので余計にハマってしまったということでした。

これはなかなか気づかなかったんですが、前にもキャッシュに苦しめられたことがあったので、もしかして。。。という感じで試しにFirefoxでアクセスしたらPHPファイルがダウンロードされなかったことで気づくことができました。

原因2の解決方法

ということで、以下の手順でキャッシュをクリアします。

  1. Chromeの「設定」(chrome://settings)を開く
  2. 下の方にある、「詳細設定を表示…」リンクをクリックする
  3. 「プライバシー」のところにある「閲覧履歴データの消去…」ボタンをクリックする
  4. 「キャッシュされた画像とファイル」にチェックを入れる(念のため「Cookieなどのサイトデータやプラグインデータ」もチェックしました)
  5. 「閲覧履歴データを消去する」ボタンをクリックする

これで再度index.phpにアクセスすると、うまくいきました。

ひとこと

かなり時間ロスしました。悔しい。。。