嵌套位置中的 Nginx 反向代理

嵌套位置中的 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 个相同的位置?

请注意,每个应用程序都有自己的静态文件。

答案1

或许,您不需要拥有多个位置,而是可以使用正则表达式将特定的 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

答案2

我有一个相关的问题,但我的问题与 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 上运行的容器和一个在 5000 上运行的 .NET Core Api,我不想更改 .NET api 中的路由,因此重写确保路由正确,以使 API 能够正确运行。

相关内容