web-dev-qa-db-ja.com

既存のすべての静的ファイルをNGINXで直接提供し、残りをバックエンドサーバーにプロキシする方法。

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に渡されて処理されます。

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

76
F. Malina

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;
}

更新:この設定の前提は、/path/to/root/of/static/filesの下にphpスクリプトが存在しないことです。これは、ほとんどの最新のphpフレームワークで一般的です。レガシーphpプロジェクトのphpスクリプトと静的ファイルの両方が同じフォルダーに混在している場合、nginxに提供したいすべてのファイルタイプをホワイトリストに登録する必要があります。

144
Chuan Ma

これを試して:

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に認識される必要があります。残りは静的ファイルとして処理されます。ロケーションを評価する実際のアルゴリズムは here です。

18
Jasiu

Mod_rewriteを使用してスクリプトの拡張子を非表示にする場合、または/で終わるきれいなURLだけが必要な場合は、別の方向からアプローチすることをお勧めします。 nginxに、静的でない拡張子を持つものはすべてApacheを通過させるように指示します。例えば:

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/wiki/NginxStatic で見つけました。

6
lo_fye