【问题标题】:502 Bad Gateway - NGINX no resolver defined to resolve502 Bad Gateway - NGINX 没有定义解析器来解析
【发布时间】:2020-01-16 03:10:40
【问题描述】:

我已经为多个 URL 创建了代理通行证。

    listen 80;
    listen [::]:80;

    server_name ~^(.*)redzilla\.11\.75\.65\.21\.xip\.io$;

            location / {
                    set $instname $1;
                    proxy_pass http://${instname}redzilla.localhost:3000;
            }

当我使用 chrome 调用此服务时,触发了 502 错误。

http://test.redzilla.11.75.65.21.xip.io/

我通过对 URL 进行硬编码,将其置于位置标签下方。

            location /redzilla {
                    proxy_pass http://test.redzilla.localhost:3000;
            }

那么它仅适用于上述 URL。我想知道如何为单个位置标记中的多个 URL 创建代理传递。 (请注意:URL 模式是 *.redzilla.localhost:3000 ,*(星号)代表任何单词)

【问题讨论】:

  • 您需要定义一个resolver statement
  • 为什么在这种情况下(在正常情况下)需要解析器语句?
  • @Joe:如果我没记错的话,是因为这次nginx真的需要解析地址:不是传给浏览器去解析,而是nginx自己去获取内容。通常,在做代理时,你会直接使用 unix socket 或 ip。
  • 我也被这个问题困住了。你有想过吗?
  • 泊坞窗中的相同错误。不使用正则表达式匹配并静态指定它可以很好地工作。 snez 的解决方案(添加“解析器 127.0.0.11;”)工作正常。对我来说似乎是一些 nginx 实现细节。

标签: nginx localhost reverse-proxy nginx-reverse-proxy


【解决方案1】:

如果您在 docker 中使用 nginx,请使用 docker network create ... 定义一个网络。属于该网络的容器(通过 docker run 上的 --network 标志)将添加一个 dns 解析器,可通过 127.0.0.11 获得。

然后在你的 server {} 指令中添加“resolver 127.0.0.11;”

【讨论】:

  • 在我的情况下,将其添加到 location 指令有效,但不是 server 指令。