[英]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.