既存のすべての静的ファイルを NGINX で直接提供し、残りをバックエンド サーバーにプロキシする方法。
-
22-08-2019 - |
質問
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (-f $request_filename) {
access_log off;
expires 30d;
break;
}
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080; # backend server listening
break;
}
}
上記では、Nginx を使用して既存のすべてのファイルを直接提供します (例:Nginx は PHP ソース コードを表示するだけです)、それ以外の場合はリクエストを Apache に転送します。*.php に対するリクエストも Apache に渡されて処理されるように、ルールから *.php ファイルを除外する必要があります。
Nginx ですべての静的ファイルを処理し、Apache ですべての動的ファイルを処理したいと考えています。
編集:ホワイトリストアプローチもありますが、あまりエレガントではありません。これらの拡張機能をすべて参照してください。私はこれを望んでいません。
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
access_log off;
expires 30d;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
編集2:新しいバージョンの Nginx では、 try_files
その代わり http://wiki.nginx.org/HttpCoreModule#try_files
解決
使用 try_files そして名前付きロケーションブロック (「@apachesite」)。これにより、不要な正規表現一致と if ブロックが削除されます。もっと効率的。
location / {
root /path/to/root/of/static/files;
try_files $uri $uri/ @apachesite;
expires max;
access_log off;
}
location @apachesite {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
アップデート: この設定の前提は、以下に php スクリプトが存在しないことです。 /path/to/root/of/static/files
. 。これは、最新の PHP フレームワークのほとんどで一般的です。従来の PHP プロジェクトに PHP スクリプトと静的ファイルの両方が同じフォルダー内に混在している場合は、nginx で提供するすべてのファイル タイプをホワイトリストに登録する必要がある場合があります。
他のヒント
これを試してください:
location / {
root /path/to/root;
expires 30d;
access_log off;
}
location ~* ^.*\.php$ {
if (!-f $request_filename) {
return 404;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
うまくいけば、それは動作します。正規表現は、プレーン弦よりも高い優先度を持っているので、唯一の対応.php
ファイルが存在する場合.php
で終わるすべてのリクエストは、Apacheにforwaredする必要があります。残りは静的ファイルとして扱われます。場所を評価する実際のアルゴリズムは、こちらされます。
あなたのスクリプトの拡張子を隠すためのmod_rewriteを使用している場合、またはあなただけの/で終わるプリティURLのような場合は、他の方向からこれにアプローチすることがあります。 apacheのに通過する非静的拡張子を使って何をできるようにnginxの教えてください。たとえばます:
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
root /path/to/static-content;
}
location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
if (!-f $request_filename) {
return 404;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
http://code.google:私は、以上のこのスニペットの最初の部分を発見しました.COM / P / scalr /ウィキ/ NginxStaticする