ITブログ

NGINXでPHPフロントコントローラの設定

NGINX + PHPのサーバーで、フロントコントローラパターンを採用しているプロダクト/フレームワークを使用する場合の、nginx.confの設定例です。

NGINX + PHPのサーバーで、フロントコントローラパターンを採用しているプロダクト/フレームワークを使用する場合の、nginx.confの設定例になります。
参考になるページは NGINX公式サイトの "Full Example Configuration" です。
1.png
 
以下の設定が含まれています。
  • php/fastcgi
  • simple reverse-proxy
  • simple load balancing
また、try_filesディレクティブを使う必要もあるので、Admin Guide > Web Server > Serving Static Content のドキュメントも参照します。
2.png
 
ここでは指定したロケーションに処理を委譲する方法(@backend)が記載されています。
※ロケーションの指定は@backendでなくても、@app、@mylocation等何でも良さそうです。
 
フロントコントローラの設定例は以下になります。
 
フロントコントローラの設定例
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
            deny  all;
        }
        # miu-cms
        location /cms {
            try_files $uri @app;
        }
        location @app {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  $document_root/cms/index.php;
            include        fastcgi_params;
        }
    }
 
説明
上部のグレー網掛け部分は基本的なWebServerの設定です。nginx.confのデフォルト値を残しています。
 
次の部分は、PHPスクリプトファイルへの直接アクセスを禁止する部分です。後方一致で指定した拡張子.phpにアクセスした場合403エラーを返します。
この設定を入れることで、存在する・存在しないに関わらずPHPスクリプトファイルへのアクセスをすべて403エラーとします。
        location ~ \.php$ {
            deny  all;
        }
 
次の部分が try_files ディレクティブで、以下の指定をしています。
①存在するファイルはそのまま返す。
②存在しないファイルは@appと名前を付けたロケーションの処理を行う。
CMSパッケージを /cms に配置する例となっています。
        location /cms {
            try_files $uri @app;
        }
 
そして最後に、@appのロケーション設定です。
PHP(FastCGI)が 127.0.0.1:9000 で動作している場合です。
        location @app {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  $document_root/cms/index.php;
            include        fastcgi_params;
        }
 
 
以上の設定で、/cms 配下にアクセスした場合、
  • ~.php へのアクセスは403エラー
  • /cms 配下の HTML, JS, CSS, 画像等 存在するファイルはそのままアクセス可能
  • /cms 配下の 存在しないURLは、html/cms/index.php で処理される
ようになります。