使用当前的 nginx 1.6.2 将 wss (websockets) 负载平衡到两台服务器。我们使用了一些粘性,如下所示。
这个配置运行良好,直到其中一个上游服务器离线。
问题:当其中一个上游服务器离线时,nginx 会发现它已离线,但会继续每隔 8 到 12 秒尝试使用它。我们尝试调整 fail_timeout,但没有任何效果。即使我们将其设置为 100,它的行为也像设置为 5 或 10 一样。注意:我们正在平衡 websocket 流量。
结果:几秒钟内,所有请求都转到剩余的在线服务器,但每隔约 10 秒,它就会尝试连接到宕机的服务器。这会导致一个或多个客户端出现长时间(400-1000 毫秒)暂停。
我们需要能够使服务器离线(为了升级等),并让 nginx 避开该服务器直到我们将其恢复。
我们还尝试将上游服务器标记为关闭,重新加载配置,但行为仍然如所述。
我们开始猜测其中一些功能可能无法按预期在 websockets 上运行?
解决办法是什么?
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream websocketserver {
hash $request_uri;
server 192.168.97.102:3842 max_fails=1 fail_timeout=5s;
server 192.168.97.202:3842 max_fails=1 fail_timeout=5s;
}
server {
listen 127.0.0.1:3841;
listen 127.0.0.1:3843 ssl;
ssl_certificate cert.cer;
ssl_certificate_key cert.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://websocketserver;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2;
proxy_read_timeout 86400;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
答案1
找到了答案。
问题设置:在 Windows 上运行 1.6.x(这是为了原型设计,而不是生产)
正常运行设置:Centos 1.7.9
我们怀疑问题在于 Windows 上的某些模块或类似的东西无法正常工作。