NGINX错误:使用proxy_pass和IPv6时“上游的端口无效”

时间:2017-08-21 21:07:47

标签: nginx

我无法在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地址是为了此示例而构成的,并且位于外部世界看不到的专用网络上。

2 个答案:

答案 0 :(得分: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 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;
        }
    }
}