我正在 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
我无法打开端口两次。
您可以查看另一个示例这里。