NGINX错误:“0”;“上游中的端口无效”;在IPv6中使用代理传递时

NGINX错误:“0”;“上游中的端口无效”;在IPv6中使用代理传递时,nginx,Nginx,在NGINX版本:NGINX/1.9.14上,我无法找到关于此NGINX错误的解释 此nginx.conf尝试将客户端请求从Web服务器端口442转发到端口9442 使用IPv4客户端和服务器地址时,一切正常,Web服务器请求被转发到9442。使用IPv6地址客户端和服务器地址时,会发生以下错误: 2017/08/21 19:05:56 [error] 6694#0: *5 invalid port in upstream "2000::157:9442/", client: 2000::158

在NGINX版本:NGINX/1.9.14上,我无法找到关于此NGINX错误的解释

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

使用IPv4客户端和服务器地址时,一切正常,Web服务器请求被转发到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地址是为了本例而组成的,并且位于外部世界看不到的专用网络上。

因此,问题在于IP格式
$sever\u addr
将获得
127.0.0.1
或IPv4的任何本地ip。而对于IPv6,它将得到与您得到的相同的
::1
2000::157
。或者在地址中有
的东西

现在,当您使用
$server\u addr
进行
proxy\u pass
时,它会变成
http://127.0.0.1:9442
http://: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;
}

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;
        }
    }
}

试试这个
listen[:]:442 ssl ipv6only=on;#IPv6支持
为什么要使用$server\u address而不是localhost?@TarunLalwani我尝试了ipv6only=on,结果相同。另外,我认为在我的版本中,通过查看文档,它的默认值为on。@AlexeyTen localhost出现以下错误:2017/08/22 18:47:42[error]32549#0:*276未定义解析程序来解析localhost,客户端:2000::158,服务器:,请求:“GET/favicon.ico HTTP/1.1”,主机:“[2000::157]:442”@Chadness3,我知道为什么会发生这个问题,只是需要测试一下如何解决它。不错,我也知道了。实际上,我制作了两个服务器{}块——一个用于ipv4,另一个用于ipv6,但您的解决方案要好得多。我将尝试您的修复。这对IPv4正常工作,但IPv6会出现以下错误,似乎该地址没有被替换为$proxy\u pass\u ip:2017/08/22 20:40:03[error]11200#0:*14上游的无效IPv6地址“[$server\u addr]:9442/json rpc/11.0/”,客户端: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,所以请尝试最新的版本