1. ホーム
  2. nginx

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

2023-02-20 18:53:05

質問

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にすべての動的なものを処理させたいのです。

EDIT: ホワイトリストアプローチもありますが、あまりエレガントではありませんし、すべての拡張機能を見ることはできません。

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

EDIT 2: 新しいバージョンの Nginx では try_files の代わりに http://wiki.nginx.org/HttpCoreModule#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に提供させたいファイルタイプをすべてホワイトリストに登録する必要があるかもしれません。