我们正在使用nginx来将请求负载平衡到我们的应用程序。 我们发现当请求超时(好)时,nginx会切换到不同的上游服务器。 但是,它会对PUT和POST请求造成不良影响(数据存储两次)。 是否有可能configurationnginx只在超时重试GET请求? 还是有另一种方法来解决这个问题?
我们的configuration如下:
upstream mash { ip_hash; server 127.0.0.1:8081; server 192.168.0.11:8081; } server { ... location / { proxy_pass http://mash/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
我知道我比较晚,但是对于我来说这是search这个问题的最好结果,所以我想分享我的解决scheme。
这使用了与自定义error handling程序相结合的if指令 (与less数几个有效的用例之一 ):
upstream backend { server backend1; server backend2; } server { server_name proxy; location / { error_page 598 = @retry; error_page 599 = @no_retry; if ($request_method = POST) { return 599; } return 598; } location @retry { proxy_pass http://backend; } location @no_retry { proxy_pass http://backend; proxy_next_upstream off; } }
从版本1.9.13开始,它成为默认行为
要手动更改它可以使用:
proxy_next_upstream error timeout non_idempotent;
使用proxy_method指令
请参阅: http : //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method
我在我的tomcat服务器有同样的问题。 超时请求发生时代理超时。 我通过使用proxy_read_timeout解决了我的问题。 当增加超时那么我的请求永远不会发生任何问题。 默认超时60秒。 参考
location / { proxy_pass http://xxxxxxxxxx.com; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; proxy_connect_timeout 800; proxy_send_timeout 800; proxy_read_timeout 240; }