nginx ‘110: Connection timed out’ 差错

gateway在prod测试时,一直报下面的错误:
connect() failed (110: Connection timed out) while connecting to upstream

前阵子做压测的时候,简单查了查,没结果,这次涉及到gateway上线,要求prod的gateway初期必须在nginx的reverse proxy后面。所以需要查明原因,给出解决方案。

google到了一些coder的blog,有的直接给的配置,说这个配置解决这个问题,这里真的要吐槽了,这个配置可能只能满足他在做压测或者生产环境的问题,这个问题依赖业务的访问场景比较重,所以不能简单的给出配置。还有些人从字面意思理解,这个问题就是nginx在从backend建立连接时超时了,所以解决方法就是增加proxy_read_timed_out的时间,例如从60s增加到120s。这个可以缓解超时导致的不能访问现象,但不能有效的fix掉这个问题,有可能nginx提供了更加好的解决方案。

根据(110: Connection timed out)查了下nginx的代码,发现是getsockopt这个系统调用发生超时错误。所以之前怀疑的nginx本身的问题是不对的。结论是,wrk压测,导致backend负载过高,不能及时处理nginx的req。更深一步的查询,我暂时做不到,因为这个可能需要自定制net/http包,添加监控来确定连接的处理情况,这个我后续会研究下net/http看是否可以定制。

下面两篇文章建议读读
tuning-nginx
http-keepalives-and-web-performance
ngx_http_upstream_module.html

当然nginx在面对这种情况是可以处理掉的,就是http协议自己的优化方式keepalive,所以在本地试验了下这个配置,果然提升1w(req/s),找op也试验了一下,确认可以根据业务场景fix掉这个问题。

nginx ‘110: Connection timed out’ 差错
Share this