![nginx 负载平衡和反向代理多端口:502 Bad Gateway](https://linux22.com/image/751153/nginx%20%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1%E5%92%8C%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%A4%9A%E7%AB%AF%E5%8F%A3%EF%BC%9A502%20Bad%20Gateway.png)
我使用了两台 Icecast 服务器,它们托管许多网络广播流。每个流使用 8000 到 9000 之间的端口。
我使用 nginx(Debian 10 上的 1.16.1)来:
- 轻松允许所有流使用 HTTPS
- 发生故障时自动更换服务器(例如:服务器关闭)。(高可用性/负载平衡)
事实上,这就是我的愿望:
当用户收听流时https://hosting.mydomain.com:8xxx,我想透明地(代理)在两个 Icecast 服务器之一上发送请求。
例子 :
如果 HTTPS 且 Icecast_1 处于活动状态,则将请求发送到 Icecast_1。
如果 HTTPS 和 Icecast_1 已关闭,则将请求发送到 Icecast_2。
为此,我进行了如下设置:
#Icecast's cluster :
upstream backend {
ip_hash;
keepalive 64;
#Icecast 1 :
server 10.1.0.101 ;
#Icecast 2 :
server 10.1.0.102 ;
}
#SSL for all
server {
listen 8000-9000 ssl ;
server_name hosting.mydomain.com;
access_log /var/log/nginx/reverse-ssl-access.log;
error_log /var/log/nginx/reverse-ssl-error.log;
# ssl on;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1 ;
ssl_certificate /etc/letsencrypt/live/hosting.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hosting.mydomain.com/privkey.pem;
location / {
resolver 8.8.8.8;
proxy_pass http://backend:$server_port;
}
}
当我尝试做这样的事情时,我遇到了一个问题:“http://后端:$server_port"。
在网络浏览器中,我遇到错误:502 Bad gateway
在服务器上的错误日志中:*1 没有定义解析器来解析后端。
你能帮助我吗 ?
答案1
您需要在上游配置中设置服务器端口。检查是否可以使用 $server_port 代替 6789。
upstream backend {
ip_hash;
keepalive 64;
#Icecast 1 :
server 10.1.0.101:6789 ;
#Icecast 2 :
server 10.1.0.102:6789 ;
}
server {
listen 8000-9000 ssl ;
server_name nginx.mydomain.com;
access_log /var/log/nginx/reverse-ssl-access.log;
error_log /var/log/nginx/reverse-ssl-error.log;
# ssl on;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1 ;
ssl_certificate /etc/letsencrypt/live/hosting.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hosting.mydomain.com/privkey.pem;
location / {
proxy_pass http://backend;
}
}
如果您想使用 $server_port,则不能使用上游,因此没有负载平衡。
location / {
proxy_pass http://10.1.0.101:$server_port;
}
答案2
@Gerard H. Pill,这是我当前服务器的配置:
#Icecast's cluster :
upstream backend {
ip_hash;
keepalive 64;
#Icecast 1 :
server 10.1.0.101:8014 ;
#Icecast 2 :
server 10.1.0.102:8014 ;
}
#SSL for all
server {
listen 8000-9000 ssl ;
server_name hosting.mydomain.com;
access_log /var/log/nginx/reverse-ssl-access.log;
error_log /var/log/nginx/reverse-ssl-error.log;
# ssl on;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1 ;
ssl_certificate /etc/letsencrypt/live/hosting.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hosting.mydomain.com/privkey.pem;
location / {
resolver 8.8.8.8;
proxy_pass http://backend;
}
}
我保存了它并重新启动了 nginx。
答案3
@Gerard H. Pille,感谢您的回答和时间。您帮了我大忙