【问题标题】:NGINX error: "Invalid port in upstream" when using proxy_pass with IPv6NGINX 错误:在 IPv6 中使用 proxy_pass 时出现“上游端口无效”
【发布时间】:2026-01-12 14:05:01
【问题描述】:

我一直无法在 nginx 版本:nginx/1.9.14 上找到此 NGINX 错误的解释。

此 nginx.conf 尝试将客户端请求从网络服务器端口 442 转发到端口 9442。

当使用 IPv4 客户端和服务器地址时,一切正常,网络服务器请求被转发到 9442。当使用 IPv6 地址客户端和服务器地址时,会出现以下错误:

2017/08/21 19:05:56 [error] 6694#0: *5 invalid port in upstream "2000::157:9442/", client: 2000::158, server: , request: "GET / HTTP/1.1",   host: "[2000::157]:442"

nginx.conf:

http {
    server {
        listen       442 ssl; # IPv4 support
        listen       [::]:442 ssl; # IPv6 support

        ssl_certificate      /etc/ssl/active.crt;
        ssl_certificate_key  /etc/ssl/active.key;

        ssl on;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass https://$server_addr:9442$request_uri;
        }
    }
}

“上游端口无效”究竟是什么意思?

请注意,本示例中的 IPv6 地址是为了本示例而编造的,并且位于外部世界看不到的专用网络上。

【问题讨论】:

  • 试试这个listen [::]:442 ssl ipv6only=on; # IPv6 support
  • 为什么要使用 $server_address 而不是 localhost?
  • @TarunLalwani 我试过 ipv6only=on 并得到相同的结果。另外,我认为无论如何在查看文档时它在我的版本中默认为 on。
  • @AlexeyTen localhost 收到以下错误:2017/08/22 18:47:42 [error] 32549#0: *276 no resolver defined to resolve localhost, client: 2000::158, server : ,请求:“GET /favicon.ico HTTP/1.1”,主机:“[2000::157]:442”
  • @Chadness3,我知道为什么会发生这个问题,只需要测试如何解决它

标签: nginx


【解决方案1】:

所以问题在于 IP 格式。 $sever_addr 将获得 127.0.0.1 或任何用于 IPv4 的本地 IP。而对于 IPv6,它会像你得到的那样得到 ::12000::157。或者地址中有:的东西。

现在当你 proxy_pass 使用 $server_addr 时,它会变成 http://127.0.0.1:9442http://::1:9442。 IPv4 一种是有效的,但 IPv6 一种是无效的。它必须是http://[::1]:9442。修复很简单,我们在 http 块中使用地图。

map $server_addr $proxy_pass_ip {
    default "$server_addr";
    ~.*:.*   "[$server_addr]";
}

我们改变我们的位置块像

location / {
   proxy_pass https://$proxy_pass_ip:9442$request_uri;
}

【讨论】:

  • 很好,是的,我也想通了。我实际上制作了两个 server {} 块 - 一个用于 ipv4,一个用于 ipv6,但您的解决方案要好得多。我会试试你的修复方法。
  • 这适用于 IPv4,但 IPv6 出现以下错误,似乎地址没有被替换为 $proxy_pass_ip: 2017/08/22 20:40:03 [error] 11200#0: *14 上游“[$server_addr]:9442/json-rpc/11.0/”中无效的 IPv6 地址,客户端:2000::158,服务器:,请求:“POST /json-rpc/11.0/ HTTP/1.1”,主机:“[2000::157]:442”,引用者:“https://[2000::157]:442/config/”
  • 哪个版本的 nginx?因为我测试过最新的,它运行良好
  • 版本为 1.9.4
  • 最新的是1.13.4所以请尝试最新的
【解决方案2】:

Tarun 正确指出的问题是,转发到 https 的 IPv6 地址需要 []::

此问题的一个解决方案是创建两个服务器块。我想使用@TarunLalwani 的解决方案,但到目前为止我还不能让它工作:

http {
    server {
        listen       442 ssl; # IPv4 support

        ssl_certificate      /etc/ssl/active.crt;
        ssl_certificate_key  /etc/ssl/active.key;

        ssl on;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass https://$server_addr:9442$request_uri;
        }
    }
    server {
        listen       [::]:442 ssl; # IPv6 support

        ssl_certificate      /etc/ssl/active.crt;
        ssl_certificate_key  /etc/ssl/active.key;

        ssl on;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass https://[$server_addr:9442]$request_uri;
        }
    }
}

【讨论】:

    最近更新 更多