我有以下负载平衡配置:
upstream upstream {
ip_hash;
keepalive 1000;
server 10.10.10.1;
server 10.10.10.2;
server 10.10.10.3;
}
server {
listen 443;
server_name example.com;
ssl_certificate /etc/nginx/certs/cert.crt;
ssl_certificate_key /etc/nginx/certs/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
location / {
client_max_body_size 80m;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90;
proxy_pass http://upstream;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我的后端节点稳定,但一切正常。但是,当我关闭其中一个节点(例如 10.10.10.2)时,NGINX 将继续向其发送流量,即使请求不断超时(因为服务器已关闭)。我已经尝试设置max_fails
和fail_timeout
参数,但行为仍然相同。
NGINX 是否能够自动检测服务器是否关闭而不向那里发送流量?我缺少什么配置?
keepalive 背后的想法是解决在高延迟网络上建立 TCP 连接的延迟问题。建立 TCP 连接需要 3 次握手,因此,当客户端和服务器之间存在可察觉的延迟时,keepalive 将通过重用现有连接来大大加快速度。
Nginx 在处理数千个连接方面非常有效,而许多后端则不然,因此,为了加快速度,人们经常将 nginx 放在他们真实的 Web 服务器前面以加快速度,这样云和用户之间的连接就会缓存 keepalive 以供后续重用。
请注意,upstream
keepalive
根据http://nginx.org/r/keepalive,nginx直到 1.1.4才支持,因为如上所述,它更有可能使用上游资源而不是加速任何处理,假设您在所有主机之间(例如,在 nginx 和上游服务器之间)有亚毫秒级的延迟。
通过在 LAN 上使用过多的 keepalive 连接,每个上游服务器数百个,即使您没有遇到您描述的问题,您也可能只会使事情变慢,而不是变快。
通常,当主机上的给定端口不可用时,主机会立即返回一个TCP 重置数据包,称为RST
,它会立即告诉客户端(例如,nginx)发生了什么,让它立即采取适当的行动。(除此之外的数据包RST
也可以用于相同的效果,例如,当到主机的路由不可用时。)
如果我们在后端停止服务,nginx 会正确处理它。该问题仅在停止整个 VM 时才会重现。– Ramiro Berrelleza 10 月 27 日 22:48
您上面的评论可能表明缺乏及时的连接拒绝数据包肯定会混淆 nginx - 您的设置似乎很可能只是丢弃了 nginx 发送的数据包。如果没有对请求的任何响应,与仅仅展示企业级行为相比,任何人如何能够知道您的后端服务是否不可用?
首先,正如已经提到的,即使您没有遇到您描述的问题,您可能只会通过upstream
keepalive
在 LAN 上使用功能来使事情变慢,尤其是在数量如此之多的情况下。
否则,您可能希望配置您的设置(防火墙、路由器、虚拟化环境等)为不可用的主机返回适当的数据包,这肯定会使 nginx 按预期工作,因为您已经测试过TCP RST数据包时会发生什么,事实上,由主机返回。
另一种选择是调整 nginx 内的各种超时,以解决您的上游消失无踪的可能性,并补偿您的网络无法生成适当的控制数据包。
这可能包括connect(2)
超时,用于建立新的 TCP 连接,通过http://nginx.org/r/proxy_connect_timeout在毫秒范围内(例如,如果您的所有服务器都在本地网络上,并且您没有运行企业级具有企业级多秒延迟的软件),以及正在进行read(2)
和send(2)
操作的超时,分别通过http://nginx.org/r/proxy_read_timeout和http://nginx.org/r/proxy_send_timeout,这将取决于关于您的后端应用程序响应请求的速度。您可能还想在上下文中增加指令的fail_timeout
参数,按照server
upstream
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server。
归档时间: |
|
查看次数: |
6187 次 |
最近记录: |