具有动态端口转发的 Nginx 反向代理

具有动态端口转发的 Nginx 反向代理

我正在 Nginx 上设置反向代理。我需要它监听多个端口。然后我想在后端服务器上访问完全相同的端口。像这样:http://前端服务器:9000->http://后端服务器:9000

以下是我认为可行的方法

   ## server configuration
    server {

        listen 9000 ;
        listen 9001 ;
        listen 9002 ;
        listen 9003 ;
        listen 9004 ;
        listen 9005 ;
        listen 9006 ;
        listen 9007 ;
        listen 9008 ;
        listen 9009 ;

        server_name frontendserver;

        if ($http_x_forwarded_proto = '') {
            set $http_x_forwarded_proto  $scheme;
        }

        location / {
                proxy_read_timeout  900;
                proxy_pass_header   Server;
                proxy_cookie_path ~*^/.* /;
                proxy_pass         http://backendserver:$server_port/;
                proxy_set_header    X-Forwarded-Port  $server_port;
                proxy_set_header    X-Forwarded-Proto $http_x_forwarded_proto;
                proxy_set_header    Host              $http_host;
                proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
        }
    }

但是,它给出了 502 Bad Gateway 错误。有什么线索可以解释为什么会这样吗?或者是否有其他方法可以像上面解释的那样工作?

如果我改变:

proxy_pass         http://backendserver:$server_port/;

proxy_pass         http://backendserver:9000/;

它运行得很好,但这当然违背了目的......

答案1

我准备的目录/var/www/9000只包含一个文件index.html,其内容为与路径名对应的端口。

server {
        listen 81;
        server_name example.com;
        location ~ /([^/]+) {
                proxy_set_header Host '10.20.30.40';
                proxy_pass http://10.20.30.40:$1/;
        }
}
server {
        listen 9000;
        server_name default;
        root /var/www/9000;
        try_files $uri $uri/index.html;
}
server {
        listen 9001;
        server_name default;
        root /var/www/9001;
        try_files $uri $uri/index.html;
}
server {
        listen 9002;
        server_name default;
        root /var/www/9002;
        try_files $uri $uri/index.html;
}

我编辑了我的hosts文件以包含我的服务器的 IP 10.20.30.40 exmaple.com,这样我就可以在不需要 DNS 服务器上进行测试。
然后我使用地址打开浏览器http://example.com:81/9000。显示的内容与我通过位置提供的端口号相对应。

然后我想这可能是变量的问题$server_name所以我做了第二次测试。

server {
        listen 82;
        server_name example.com;
        location / {
                proxy_set_header Host '10.20.30.40';
                proxy_pass http://10.20.30.40:90$server_port/;
        }
}
server {
        listen 9082;
        server_name default;
        root /var/www/9082;
        try_files $uri $uri/index.html;
}

现在我打开浏览器,http://example.com:82内容显示9082如预期。

如果您提供组名以外的任何内容,upstream它将被视为域名。这时您就会收到错误Bad gateway

您的解决方案如下:
您需要使用map将请求的端口转换为upsteam组,并在中使用它proxy_pass

upstream mycustombackend9082 {
        server 10.20.10.48:9082;
}
map $server_port $backendname {
        82      mycustombackend9082;
}
server {
        listen 82;
        server_name example.com;
        location / {
                proxy_set_header Host '10.20.30.40';
                proxy_pass http://$backendname;
        }
}
server {
        listen 9082;
        server_name default;
        root /var/www/9082;
        try_files $uri $uri/index.html;
}

在我的例子中,我需要写入,82因为map我无法打开端口两次。
您可以查看另一个示例这里

相关内容