[转帖]nginx 的超时设置

nginx,超时,设置 · 浏览次数 : 0

小编点评

**proxy_connect_timeout** * 影响:允许指定连接超时时间,默认值为75秒。 * 设置方法:在nginx配置文件中设置proxy_connect_timeout参数。 **proxy_read_timeout** * 影响:允许指定读取超时时间,默认值为60秒。 * 设置方法:在nginx配置文件中设置proxy_read_timeout参数。 **proxy_send_timeout** * 影响:允许指定发送超时时间,默认值为60秒。 * 设置方法:在nginx配置文件中设置proxy_send_timeout参数。 **建议** * 在调整nginx超时时间参数之前,请考虑业务场景和性能影响。 * 不要设置proxy_connect_timeout过大,因为它可能影响被动健康检查的效果。 * 可以适当调大proxy_read_timeout和proxy_send_timeout,但要注意性能影响。

正文

前言

我们在使用nginx做反向代理的时候,可能会遇到这个场景:后端正常的业务处理时间超过了nginx的超时时间,导致nginx主动返回504。为解决这个问题,我们网上搜索发现可以通过调整这几个参数来调大nginx的超时时间。
proxy_connect_timeout
proxy_send_timeout
proxy_read_timeout
我们调大之后发现问题确实解决了。那么这个几个参数是什么意义?是否应该都调大呢?

nginx 三个代理超时时间配置

我们先看下nginx官网对他们的解释:

proxy_connect_timeout 60s;

Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75
seconds.
定义与被代理服务器建立连接的超时时间。请注意,此超时通常不能超过75秒。

proxy_send_timeout dedault 60s

Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for
the transmission of the whole request. If the proxied server does not
receive anything within this time, the connection is closed.

设置将请求传输到被代理服务器的超时时间。只在两个连续的写操作之间设置超时,而不是整个请求的传输。如果代理服务器在这段时间内没有收到数据,连接将被关闭。

proxy_read_timeout default 60s

Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for
the transmission of the whole response. If the proxied server does not
transmit anything within this time, the connection is closed.

定义从被代理服务器读取响应的超时。超时设置仅在两个连续的读取操作之间,而不是整个响应的传输。如果代理服务器在这段时间内没有传输数据,连接将被关闭。

网上有些文章说 proxy_read_timeout 和 proxy_send_timeout 指的是nginx到后端的数据传送和回传超时时间,不知是不是因为版本的原因,这个说法是错误的。按照现在官网的说法是两次“读”和“写”操作之间的间隔,并不是整个数据传输时间。具体“读”和“写”是什么意思不清楚,但我推测是从socket中的读写操作。并且我在实验中发现,大致上是收到的俩个tcp报文是间隔时间超过上面的超时时间nginx就会主动断开连接。如果nginx和后端一直有数据传输,是不会触发超时的。比如websocket 可以通过定时发送心跳包来保持长连接,只要心跳包的间隔小于上面设置的send和read的超时时间即可

并且值得注意的是并不是所有超时nginx都会记录504状态码。比如在nginx收到后端响应头前超时,nginx会返回504状态码并记录error日志;但在client已经开始收到response header后,比如传输body中超时,nginx断开连接后会在access日志中记录200,客户端则会抛出连接断开的异常。

proxy_connect_timeout 官网的注释是不能超过75s。其他系统环境不清楚,linux 下这个超时时间是和内核的syn重使次数net.ipv4.tcp_syn_retries 对应的超时时间取最小值。比如一般net.ipv4.tcp_syn_retries设置重试次数为6,若建连时间超过127s系统就会关闭,那么nginx设置再大的proxy_connect_timeout 也是没有意义的

看完上面对这三个参数的解释后,那我们在调整超时时间的时候改怎么调整呢?
我的建议是再生产环境中可以根据业务场景调大proxy_read_timeout 和 proxy_send_timeout ,但是不建议 调大proxy_connect_timeout。

原因是生产环境中nginx和后端服务器一般是走内网通讯,正常情况下建链时间本来就不应该太长。另外一个很重要的原因是如果nginx开启的被动健康检查,过长的proxy_connect_timeout 会严重影响被动健康检查的效果

nginx的被动健康检查

upstream upcheck {
server 127.0.0.1:8000 max_fails=1 fail_timeout=10s ;
}
这个一个默认的nginx被动健康检查的配置max_fails=1 fail_timeout=10s 这段的大致意思是10s内,这个节点的请求失败数超过1则会将其标记为down,下个10s内不会有新的请求到达该节点。详细的介绍大家可以去官网或者论坛去搜索,这里不再赘述。下面我着重讲一下proxy_conncet_timeout对他的影响。

被动健康检查一个常见的场景就是当后端有台服务器宕机的时候,如果proxy_connect_timeout 设置为5s,5s后nginx和后端建链超时,该条请求被标记为失败,该节点被置为down。这样可以在一定程度上做到快速止损。而假如我们将proxy_connect_timeout 设置为60s,所有到达该节点的请求60s后才会因为超时剔除宕机节点。

下面我做一个简单的实验来对比一下宕机情况下proxy_connect_timeout设置为5s和60s的区别

两组upstream都为2个节点,采用默认被动健康检查配置(max_fails=1 fail_timeout=10s),其中一个节点不可用(ping不通),关闭nginx重试,每秒请求一次,持续10分钟
nginx配置

server {
	listen 80;
	server_name _ ;
	access_log /opt/log/ngx-lan_access.log main;
	location = /upcheck {
    	proxy_next_upstream_tries 1;
		proxy_connect_timeout 5s;
		proxy_pass http://upcheck;
	} 
	location = /upcheck2 {
		proxy_next_upstream_tries 1;
		proxy_connect_timeout 60s;
		proxy_pass http://upcheck2;
	}
	upstream upcheck {
		server 127.0.0.1:8500 max_fails=1 fail_timeout=10s ;
		server 192.168.100.100:8500 max_fails=1 fail_timeout=10s ;
	}
	upstream upcheck2 {
    	server 127.0.0.1:8500 max_fails=1 fail_timeout=10s ;
    	server 192.168.100.100:8500 max_fails=1 fail_timeout=10s ;
	}
}

    用curl访问

    for i in {1..600}; do curl http://127.0.0.1/upcheck -I > /dev/null 2>&1  & sleep 1; done
    for i in {1..600}; do curl http://127.0.0.1/upcheck2 -I > /dev/null 2>&1  & sleep 1; done
    
    • 1
    • 2

    然后统计一下这两组配置的200状态码

    5s的这组 200状态码个数是 558
    60s的这组 200状态码个数是 468

    这个对比还是很明显的

    总结

    我们在设置nginx的超时配置的时候,proxy_connect_timeout 建议设置的比较小,proxy_read_timeout 和 proxy_send_timeout 可以适当调大

    文章知识点与官方知识档案匹配,可进一步学习相关知识
    CS入门技能树Linux入门初识Linux26144 人正在系统学习中

    与[转帖]nginx 的超时设置相似的内容:

    [转帖]nginx 的超时设置

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

    [转帖]Nginx超时timeout 设置

    Nginx 超时配置,连接时间过长直接关闭连接,显示timeout http { #每个 TCP 连接最多可以保持多长时间 keepalive_timeout 60; #客户端向服务端发送一个完整的 request header client_header_timeout 10; #客户端发送服务端

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

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

    [转帖]Nginx优化与防盗链

    目录 一、配置Nginx隐藏版本号1、第一种方法修改配置文件2、第二种方法修改源码文件,重新编译安装 二、修改Nginx用户与组三、配置Nginx网页缓存时间四、实现Nginx的日志分割五、配置Nginx实现连接超时六、更改Nginx运行进程数七、配置Nginx实现网页压缩功能八、配置Nginx防盗

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

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

    [转帖]用了这18种方案,接口性能提高了100倍!

    https://juejin.cn/post/7167153109158854687 前言 大家好,我是捡田螺的小男孩。 之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分

    [转帖]超时时间connectTimeout,socketTimeout,proxy_read_timeout,proxy_connect_timeout笔记

    1、一般的的情况 客户端(connectTimeout,socketTimeout) -- 七层接入proxy (connect timeout, read timeout, keepalive timeout, send timeout)-- nginx (proxy_read_timeout,p

    [转帖]总结:nginx502:Tomcat调优之acceptCount

    问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因。 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出原因:是因为tomcat8默认的acceptCount是100,请求量大的时候,会将一些来不及处理的

    [转帖]nginx源码编译及优化

    Apache与nginx的区别 apache: 进程,稳定模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多 nginx: 线程,快,不稳定。多线程是共享的,一个线程出问题,其他的也会受牵连。7层调度,反向代理能力强。CDN这块nginx也用的多轻量级,同样起web 服务,比a

    [转帖]Nginx性能优化-CPU篇

    性能优化方法论 软件层面提升硬件使用率 增大CPU的利用率 增大内存的利用率 增大硬盘IO的利用率 增大网络带宽的利用率 提升硬件 网卡:万兆网卡 硬盘:固体硬盘,关注IOPS和BPS指标 CPU:更快主频,更多核心,更大缓存,更优架构 内存:更快访问速度 超出硬件性能上限后使用DNS CPU基本知