我想问一下关于Nginx请求的重试。 我有一个运行在后端的Nginx,然后将请求发送到HaProxy然后在Web服务器上传递它并处理请求。 我正在重新加载我的Haproxyconfigurationdynamic提供弹性。 问题是当我重新加载Haproxy时请求被丢弃。 所以我想有一个解决scheme,我可以从Nginx重试。 我查看了http模块中的proxy_connect_timeout,proxy_next_upstream和服务器模块中的max_fails和fail_timeout。 我最初只有1个服务器在上游连接,所以我只是这个了两次现在和更less的请求被丢弃(只有当)有同样的服务器上游两次,如果我有同样的服务器3-4次下降增加)。
所以,首先我想现在,当一个请求无法build立从Nginx到Haproxy的连接,所以当重新加载时,似乎连接被认为是错误和直接的请求被丢弃。
那么我怎么能指定失败后的时间,我想重试从Nginx到上游的请求,或者Nginx把它作为失败请求处理的时间。
(我已经尝试越来越proxy_connect_timeout – 没有帮助,mail_retires,fail_timeout,并把两个相同的上游服务器(迄今为止最好的结果)
Nginxconfiguration文件
上游gae_sleep {
server 128.111.55.219:10000;
}
服务器{
listen 8080; server_name 128.111.55.219; root /var/apps/sleep/app; # Uncomment these lines to enable logging, and comment out the following two #access_log /var/log/nginx/sleep.access.log upstream; error_log /var/log/nginx/sleep.error.log; access_log off; #error_log /dev/null crit; rewrite_log off; error_page 404 = /404.html; set $cache_dir /var/apps/sleep/cache; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://gae_sleep; client_max_body_size 2G; proxy_connect_timeout 30; client_body_timeout 30; proxy_read_timeout 30; } location /404.html { root /var/apps/sleep; } location /reserved-channel-appscale-path { proxy_buffering off; tcp_nodelay on; keepalive_timeout 55; proxy_pass http://128.111.55.219:5280/http-bind; }
}
所以在试图find在nginx上重试请求的答案之后,我还没有find一个干净的重试请求的方法,但想出了一个哈克的方式。 所以在nginx conf的上游部分,你应该把nginx重试的同一个上游服务器的多个副本放在上游服务器级别。 如果一台上游服务器发生故障,则nginx会在另一台上游服务器上尝试请求。 如果你只有一个上游服务器,就像我有它不会重试请求。 所以为了克服这个问题,我把同一个上游服务器的多个副本放在一起,这样在nginx通过服务器列表并发送请求时,上游服务器(在这种情况下是haproxy)将会重新加载并且请求将会到达。 在http模块和服务器模块中,通过nginx提供的各种超时也是非常重要的。 “fail_timeout” – 说如果一个上游服务器不可用,它停止x秒,但如果它们都不可用,那么它不会退役(我提到这是nginx遍历整个列表的时间)没有出现,但这不会成为一个问题,因为这个属性)PS:这是一个hacky的解决scheme,我必须在我的nginx文件中有一些100-150的上游项目,以减less错误的数量。 更好的解决scheme欢迎:)
不完全是你问的,但也许更重要的是:你如何重新启动HAProxy? 使用SF选项,您应该能够重新启动HAProxy,无需删除任何连接请求。 我不相信nginx可以重试请求,但如果你真的想要你可以有一个HAProxy前端到另一个HAProxy实例。 然后HAProxy将重试请求到第二个实例。 但这似乎真的很愚蠢。 首先检查SF选项。
重新启动HAProxy脚本(从评论)greps只是为了我的温暖模糊的感觉:
#!/bin/sh ps -ef | grep haproxy haproxy -f haproxy.cfg -sf $(cat /var/run/haproxy.pid) ps -ef | grep haproxy