我们在Docker群中使用NGINX作为反向代理,NGINX位于覆盖网络中,并将外部请求中继到相关的群服务。
然而,我们有一个问题,每次我们重新启动/更新或以其他方式关闭一个swarm服务时,NGINX都会返回502 Bad Gateway
。即使在服务重新启动后,NGINX也会继续为502
提供服务,直到我们重新启动NGINX服务才能纠正这个问题,这显然违背了在多个地方运行负载均衡器和服务的全部意义。
下面是我们的NGINX CONF:
events {}
http {
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
client_max_body_size 20M;
large_client_header_buffers 8 256k;
client_header_buffer_size 256k;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
map $host $client {
default clientname;
}
#Healthcheck
server {
listen 443;
listen 444;
location /is-healthy {
access_log off;
return 200;
}
}
#Example service:
server {
listen 443;
server_name scheduler.clientname.com;
location / {
resolver 127.0.0.11 ipv6=off;
proxy_pass http://$client-scheduler:60911;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
#catchll
server {
listen 443;
listen 444;
server_name _;
location / {
return 404 'Page not found';
}
}
}
我们使用$client占位符,否则当其中一个服务关闭时,我们甚至无法启动nginx。
另一种选择是使用一个有健康检查的上游指令,它可以很好地工作。这样做的问题是,如果任何服务不可用,NGINX甚至不会启动!
我们做错了什么?
更新看起来我们在这里想要的是不可能的(请证明我错了!)。在docker和微服务的世界里错过这样的功能似乎很疯狂!
我们目前正在考虑将HAPROXY作为替代方案,因为可以使用default-server init-addr none
进行设置,以在启动时停止失败。
2条答案
按热度按时间btxsgosb1#
我是这样做的,用max_fails=创建一个上游
x0fgdtte2#
我使用docker-compose也遇到了同样的问题。Nginx容器无法连接
docker-compose restart
之后的Web服务。最后我总结了两个原因,一是
docker-compose restart
在web重启后,没有遵循重启nginx的depends_on,二是docker-compose restart
重新分配了一个新的内部IP地址给容器,nginx在启动后没有刷新web IP地址。我的解决方案是定义一个变量来强制nginx每次解析IP: