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

StackOverflow https://stackoverflow.com/questions/869001

質問

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する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top