NGINX错误:“0”;“上游中的端口无效”;在IPv6中使用代理传递时
在NGINX版本:NGINX/1.9.14上,我无法找到关于此NGINX错误的解释 此nginx.conf尝试将客户端请求从Web服务器端口442转发到端口9442 使用IPv4客户端和服务器地址时,一切正常,Web服务器请求被转发到9442。使用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
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,所以请尝试最新的版本