如何停止nginx在上游服务器超时时重试PUT或POST请求?


11

我们正在使用nginx负载平衡请求到我们的应用程序。我们发现,当请求超时(良好)时,nginx切换到其他上游服务器。但是,它对PUT和POST请求执行此操作,这可能会导致不良结果(数据存储两次)。是否可以将nginx配置为仅在超时时重试GET请求?还是有解决问题的另一种方法?

我们的配置如下:

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;        
    }
}

Answers:



6

我知道我来晚了,但是对我来说,这是搜索此问题时的最佳成绩,因此我想分享我的解决方案。

这将if指令(具有少数有效用例之一)与自定义错误处理程序结合使用:

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;
    }
}

4

请在此处查看文档:proxy_next_upstream

请注意,这是未经测试的要点

https://gist.github.com/wojons/6154645


实际上它不起作用:Nginx说“这里不允许使用proxy_next_upstream”。我尝试将if块移到位置,并得到相同的错误。在任一位置上自行使用“ proxy_next_upstream错误”。
大卫·廷克

这很奇怪,因为那里的文档清楚地表明它可以在位置上下文中使用
WojonsTech 2013年

nginx不喜欢proxy_next_upstream周围的if(...){}
David Tinker

有人测试过吗?4票,但似乎不符合这里的有效用例:nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM


-1

我的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;     
}

1
这根本无法回答问题。您的问题完全不同。
Sven
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.