web-dev-qa-db-ja.com

ネストされた場所でのNginxリバースプロキシ

複数のサーバーで複数のアプリケーションのリバースプロキシとしてNginxを使用しており、各アプリケーションの静的ファイルに共通のキャッシュディレクティブを追加しようとしています。

私の元の構成は次のようなものです。

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8082/app2; 
}

...

静的ファイルディレクティブを追加するには、次のようにネストされた場所を各場所に追加します。

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
    location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
        expires 1d;
        ...
        proxy_pass http://127.0.0.1:8081;
    }
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8082/app2;
    location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
        expires 1d;
        ...
        proxy_pass http://127.0.0.1:8082;
    }
}

私は30のアプリケーションのようなものを持っているので、コードを次のようなものに単純化しようとしています。

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
    include static_file_config.conf;
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8081/app2;
    include static_file_config.conf;
}

静的ファイルの30の同一の場所で終わらないように、コードを単純化する方法はありますか?

各アプリケーションは独自の静的ファイルを提供することに注意してください。

3
Jose Antonio

おそらく、多くの場所を用意する代わりに、正規表現を使用して特定のURIをアップストリームアプリケーションに一致させることができます。

location ~ /(app)(\d+) {
   proxy_pass http://127.0.0.1:808$2/$1$2;
   include static_file_config.conf;
}

ここでどのように機能するかを確認できます: https://regex101.com/r/sM3eS9/1

3
Vasili Syrakis

関連する問題がありましたが、Dockerコンテナーに関連していて、次のようにして解決しました。

server {
   listen       80;
   server_name  some_application_name;
   port_in_redirect off;
   location / {
            proxy_set_header Host $Host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:5555;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /api {
            rewrite ^/api(.*)$ $1 break;
            proxy_set_header Host $Host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:5000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

上記のコンテナは5555で実行され、.NET Core Apiは5000で実行されていますが、.NET APIのルートを変更したくなかったので、書き直して、APIから関数への正しいルートが正しいことを確認しました。

0
leeroya