[转帖]nginx的proxy_next_upstream使用中的一个坑

nginx,proxy,next,upstream,使用,一个 · 浏览次数 : 0

小编点评

**问题描述:** 线上系统出现问题,机房的电信出口突然不通,导致业务告警。 **解决方案:** 使用 `nginx` 的 `proxy_next_upstream` 指令配置重试机制。`non_idempotent` 是 `proxy_next_upstream` 指令中一个特殊配置项,用于指定重试策略。 **配置:** ```nginx proxy_next_upstream error timeout http_500 non_idempotent; ``` **解释:** * `proxy_next_upstream` 指令用于指定重试策略。 * `error` 指令指定重试类型,此处为 `timeout`。 * `timeout` 指令指定重试等待的毫秒数,此处为 `500`。 * `non_idempotent` 指令指定重试策略的非可重复性。 **结果:** 当服务器返回 `500` 或 `timeout` 时,客户端会尝试再次发送请求。但 `non_idempotent` 指令确保该请求不会被重复执行。

正文

https://zhuanlan.zhihu.com/p/35803906

 

今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。

当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服务器去,采用的是nginx的proxy_next_upstream, 配置大概如下:

upstream example_upstream{
  server 192.168.0.1 max_fails=1 fail_timeout=30s;
  server 192.168.0.2 max_fails=1 fail_timeout=30s backup;
}
location /example/ {
   proxy_pass http://example_upstream/;
   proxy_set_header Host: test.example.com;
   proxy_set_head X-real-ip $remote_addr;
   proxy_next_upstream error timeout http_500;
}

按照设想,如果192.168.0.1这台服务器返回了超时或者500,那么访问 /example/ 时应该会自动重试到下一台服务器去,即到192.168.0.2去。

但是情况并没有发生,于是造成了业务故障。

事后我使用openresty,写了些简单的hello world来测试nginx的这个proxy_next_upstream, 完全没有问题呀,可是线上的这个服务就是不行,真的想砸了电脑的心都有了。

在公司反反复复试验了几十次,快到晚上十点才下班回家。回家路上突然想到一种可能,兴奋得想赶紧回到家试验试验。然而到家后试验,并未成功,甚是失望。又反反复复试验了一个小时,总是失败。

然后重新看文档,Module ngx_http_proxy_module ,走投无路,只能逐字逐句看文档了,突然看到这么一段:

这段在公司查找的时候就看到了,但是对non-idempotent 这个单词,我不认识,然后想当然的理解为某个意思,于是就没有去认真看完这段话,觉得和问题没有关系。

把这个配置加进去,变成: proxy_next_upstream error timeout http_500 non_idemponent; 问题终于解决了。

这段话的意思是说,像 post, lock, patch 这种会对服务器造成不幂等的方法,默认是不进行重试的,如果一定要进行重试,则要加上这个配置。

至于为什么我用openresty写的试验会成功,而线上的这个服务一直失败的原因,实则是因为我试验的接口是GET访问的,而线上的服务是POST访问的。

之所以今天会出现这个故障,也是因为线上系统最近升级了nginx,如上图所示,这个配置是 1.9.13版本之后才有的。

以后还是要仔细认真读官方文档啊

与[转帖]nginx的proxy_next_upstream使用中的一个坑相似的内容:

[转帖]nginx的proxy_next_upstream使用中的一个坑

https://zhuanlan.zhihu.com/p/35803906 今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服

[转帖]nginx的重试机制 proxy_next_upstream

https://blog.csdn.net/xiao__gui/article/details/89441162 https://zhuanlan.zhihu.com/p/35803906 https://www.cnblogs.com/powerwu/articles/9791295.html h

[转帖]nginx的重试机制 proxy_next_upstream

https://blog.csdn.net/xiao__gui/article/details/89441162 https://zhuanlan.zhihu.com/p/35803906 https://www.cnblogs.com/powerwu/articles/9791295.html h

[转帖]nginx http超时重试幂等问题

https://blog.csdn.net/wangtingting_100/article/details/89842557 nginx做反向代理时,作为负载均衡器,对执行失败的任务默认会调度到其他节点执行。 默认设置:proxy_next_upstream error timeout #发生网络

[转帖]使用nginx的proxy_store缓存文件加速访问速度

https://www.qiansw.com/using-nginxs-proxystore-cache-file-to-accelerate-access-speed.html nginx的proxy_store可以将后端服务器的文件暂存在本地. 基于此,可以实现nginx的缓存后端服务器文件,加

[转帖]浅析Nginx配置获取客户端真实IP的proxy_set_header、X-Real-IP、$remote_addr、X-Forwarded-For、$proxy_add_x_forwarded_for分别是什么意思

https://www.cnblogs.com/goloving/p/15588668.html 一、问题背景 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用 request.getRemoteAddr() 就可以获取到客户端ip,但是

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]NGINX的一些SEO优化常用配置

https://www.jianshu.com/p/e55073e5ebc7 官方文档:http://nginx.org/en/docs/ 常用模块: ngx_http_core_module ngx_http_rewrite_module ngx_http_proxy_module ngx_htt

[转帖]nginx 的超时设置

前言 我们在使用nginx做反向代理的时候,可能会遇到这个场景:后端正常的业务处理时间超过了nginx的超时时间,导致nginx主动返回504。为解决这个问题,我们网上搜索发现可以通过调整这几个参数来调大nginx的超时时间。 proxy_connect_timeout proxy_send_tim