我无法在nginx版本上找到此NGINX错误的解释:nginx / 1.9.14。
此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地址是为了此示例而构成的,并且位于外部世界看不到的专用网络上。
答案 0 :(得分:1)
所以问题在于IP格式。 $sever_addr
将获得127.0.0.1
或IPv4的任何本地IP。对于IPv6,它将获得::1
或2000::157
,就像你得到的那样。或者在地址中有:
的东西。
现在当proxy_pass
使用$server_addr
时,它会变为http://127.0.0.1:9442
或http://::1:9442
。 IPv4 one有效但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;
}
答案 1 :(得分:0)
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;
}
}
}