NGINX + PHPのサーバーで、フロントコントローラパターンを採用しているプロダクト/フレームワークを使用する場合の、nginx.confの設定例です。
NGINX + PHPのサーバーで、フロントコントローラパターンを採用しているプロダクト/フレームワークを使用する場合の、nginx.confの設定例になります。
参考になるページは NGINX公式サイトの "Full Example Configuration" です。
以下の設定が含まれています。
- php/fastcgi
- simple reverse-proxy
- simple load balancing
また、try_filesディレクティブを使う必要もあるので、Admin Guide > Web Server > Serving Static Content のドキュメントも参照します。
ここでは指定したロケーションに処理を委譲する方法(@backend)が記載されています。
※ロケーションの指定は@backendでなくても、@app、@mylocation等何でも良さそうです。
フロントコントローラの設定例は以下になります。
フロントコントローラの設定例
server {
listen 80;
server_name localhost;
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location = /50x.html {
root html;
}
location ~ \.php$ {
deny all;
}
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;
}
}
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;
}
deny all;
}
次の部分が try_files ディレクティブで、以下の指定をしています。
①存在するファイルはそのまま返す。
②存在しないファイルは@appと名前を付けたロケーションの処理を行う。
CMSパッケージを /cms に配置する例となっています。
location /cms {
try_files $uri @app;
}
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;
}
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 で処理される
ようになります。