我正在使用 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 能够正确运行。