[英]Nginx proxy_pass in docker container doesn't process static files
我在 docker 中有 2 个服务后端和前端(nodejs),它们通过 nginx(也在 docker 中)处理。
Nginx 配置:
server {
listen 80;
listen 443 http2;
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
server_name example.com;
location /backend/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://backend-admin:2082/;
}
location ^~ / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://frontend-admin:8080;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|ttf|svg|js)$ {
expires 2d;
add_header Cache-Control public;
}
}
我使用 nginx 位置/backend/
将所有请求代理到example.com/backend/...
到example.com:2082/...
那个 nodejs 正在监听。
主要问题是我的 static 文件来自 proxy_pass backend-admin:2082
nginx 不想处理。
如果我像http://example.com:2082/uploads/events/1.jpg
这样打开它,我的后端服务/uploads/events/1.jpg
中有上传图像的路径。 但是通过 nginx 它不是http://example.com/backend/uploads/events/1.jpg
。 我认为这里 nginx 事件不会尝试通过 proxy_pass 到达图像。
有任何想法吗?
static 文件的正则表达式优先于/backend/
,因为它的匹配时间更长。 location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|ttf|svg|js)$
表示匹配以列出的后缀结尾的任何查询. .+
是正则表达式的贪婪部分,它将匹配在达到后缀之前写入的任何内容。 因此,任何具有列表后缀的内容都将被计算为最长匹配并发送以从本地文件中读取,而不是将请求发送到“/backend/”。
有多种方法可以解决此问题,具体取决于您实际想要实现的目标。 一种方法是添加另一个位置,仅针对从容器提供的 static 文件,如下所示:
location ~* ^/backend/.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|ttf|svg|js)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^/backend/(.*) /backend/$1 break;
proxy_pass http://backend-admin:2082;
expires 2d;
add_header Cache-Control public;
}
此修复将允许您仍然缓存本地文件,但将所有其他具有/backend/
前缀的文件转移到容器。
为了更好地了解匹配是如何完成的,您可以使用一些在线匹配模拟器。 这是我使用的Nginx位置匹配测试仪
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.