【问题标题】:Nginx proxy_pass in docker container doesn't process static filesdocker容器中的Nginx proxy_pass不处理静态文件
【发布时间】:2021-03-16 02:06:41
【问题描述】:

我在 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 正在监听。

主要问题是我的来自 proxy_pass backend-admin:2082 nginx 的静态文件不想处理。

我的后端服务/uploads/events/1.jpg 中有上传图像的路径,如果我像http://example.com:2082/uploads/events/1.jpg 一样打开它,它就可以工作。但是通过 nginx 它不会http://example.com/backend/uploads/events/1.jpg。我认为这里的 nginx 事件不会尝试通过 proxy_pass 到达图像。

有什么想法吗?

【问题讨论】:

  • /位置是否正常工作?您可以尝试 /backend/ 端点而不尝试访问特定文件(例如没有 .jpg)吗?
  • 除静态文件外一切正常。后端位置的静态文件。来自前端的静态文件,例如:example.com/build/build.js - 有效。
  • 尝试删除结尾斜线proxy_pass http://backend-admin:2082/;

标签: node.js docker nginx


【解决方案1】:

静态文件的正则表达式优先于/backend/,因为它的匹配时间更长。 location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|ttf|svg|js)$ 表示匹配任何以列出的后缀结尾的查询。 .+ 是正则表达式的贪婪部分,它将匹配到达后缀之前写入的任何内容。因此,任何具有列表后缀的内容都将被计算为最长匹配并发送到从本地文件中读取,而不是将请求发送到“/backend/”。

有多种方法可以解决此问题,具体取决于您实际想要实现的目标。一种方法是添加另一个位置,仅针对从容器提供的静态文件,如下所示:

    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 location match tester

【讨论】:

  • 您的解决方案不起作用。不幸的是 - nginx:[emerg]“proxy_pass”不能在正则表达式给出的位置、命名位置、“if”语句或“limit_except”块中包含URI部分
  • @אלננורמן 我添加了重写规则,这应该可以解决正则表达式的问题
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2015-03-17
  • 2017-01-22
  • 2022-01-22
  • 2023-02-26
  • 1970-01-01
  • 2016-07-17
  • 2022-11-03
相关资源
最近更新 更多