Nginx重试机制注意点

网关用Nginx做了反向代理和负载均衡,Nginx下挂着两台服务器,每台机器上都装着Tomcat,用户打开浏览器,点击页面,访问后端接口,查看Nginx的access.log,结果这一条请求打在了两台服务器上。

nginx的重试机制就是容错的一种,在nginx的配置文件中, proxy_next_upstream 项定义了什么情况下进行重试,官网文档中给出的说明如下:

Syntax:proxy_next_upstream error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_403|http_404|off Default:proxy_next_upstream error timeout;Context:http,server,location

默认情况下,当请求服务器发生错误或超时时,会尝试到下一台服务器。

原因是Nginx配置文件中,超时时间太短了:proxy_connect_timeout 20;;在Nginx的默认配置是:在客户端请求服务器超时的情况下,Nginx会自动转发该请求到另外一台服务器上,这是Nginx的一种容错机制,所以Nginx的访问日志中会出现同一条请求而两台服务器都执行了一遍的情况,这样以来,程序如果没有做幂等性操作的话数据库会出现两条记录。

还有一个参数影响了重试的次数:proxy_next_upstream_tries ,官方文档中给出的说明如下:

Syntax:proxy_next_upstream_tries number;Default:proxy_next_upstream_tries0;Context:http,server,location    This directive appearedinversion1.7.5.

调整

本来就是Nginx的一种容错机制,这种机制在查询操作还是挺好的,如果是插入操作,那就有点问题了,如果这条插入的请求特别耗时,并且时间超过Nginx的proxy_connect_timeout时间设置,Nginx会自动将该请求转发集群中的另外一台服务器的。但是我们不能将这种机制关闭,关闭以后会影响Nginx效率的,那怎么办哪?于是想出了一个临时解决方案,专门针对耗时时间长的几个接口做一下过滤,也就是说,在Nginx的server配置标签中,专门对几个特定的url过过滤,关闭Nginx的重试机制,配置如下

server{location~/api/insertData{proxy_connect_timeout60;proxy_send_timeout60;proxy_read_timeout60;proxy_next_upstream off;}}

也可以直接关闭重试机制

proxy_next_upstream off;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、交易型系统设计的一些原则 1.在设计系统时,应该多思考墨菲定律: * 任何事情都没有表面看起来那么简单 * 所...
    ZyBlog阅读 13,430评论 2赞 48
  • proxy_cache:使用内存给/SSD级代理缓存内容 proxy_cache_lock:使用lock机制,将多...
    oo尐爺籽阅读 358评论 0赞 0
  • 文字: proxy模块 HTTP反向代理处理流程 proxy模块 功能:对上游服务器使用http/https协议进...
    求得浅欢风日好阅读 3,445评论 0赞 1
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 2,078评论 0赞 3
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 2,281评论 0赞 9

友情链接更多精彩内容