Nginx主要有四种超时设置:客户端超时设置、DNS解析超时设置、代理超时设置,如果使用的话,还有Lua相关的超时设置。
1.客户端超时设置
客户端超时的主要设置包括读请求头超时、读请求体超时、发送响应超时、长连接超时。 使用客户端超时设置,避免恶意客户端或网络状况不佳造成连接长期占用,影响服务器的处理能力。
t time:设置读取客户端请求头的超时时间。 默认值为 60 秒。 如果客户端未在此超时时间内完成请求标头的发送,则会向客户端响应 408(-out)状态代码。
time:设置读取客户端内容正文的超时时间。 默认值为 60 秒。 该超时是指两次成功读取操作之间的时间,而不是发送整个请求正文的超时。 如果客户端没有在这个超时时间内发送,任何请求主体都会以 408(-out)状态码响应给客户端。
time:设置向客户端发送响应的超时时间。 默认值为 60 秒。 此超时还指两次成功写入操作之间的时间,而不是发送整个响应的超时。 如果客户端在这个超时时间内没有收到任何响应,Nginx 将关闭连接。
【】:设置HTTP长连接超时时间。 第一个参数告诉Nginx长连接超时是多少。 默认值为 75 秒。 第二个参数用于设置响应头“Keep-Alive:=time”,它告诉客户端长连接超时时间。 这两个参数可以不同。 “Keep-Alive:=time”响应头可以在 和 系列浏览器上工作,而 MSIE 长连接默认为 60s 左右,“Keep-Alive:=time”不会被使用。 例如,框架将使用“Keep-Alive:=time”响应头的超时(如果未设置默认值,则认为是永久的)。 如果设置为 0,则禁用长连接。
该参数应与 一起使用。 指示哪些浏览器禁用了长连接。 默认值为msie6,它禁用某些旧版本MSIE的长连接支持。 该参数的作用是客户端通过这个长连接可以发出的请求数量。 默认值为 100。
首先,浏览器在发出请求时会通过以下请求头告知服务器是否支持长连接。
http/1.0默认禁用长连接,需要添加HTTP请求头“:Keep-Alive”来启用。 HTTP/1.1默认启用长连接,需要通过添加HTTP请求头“:close”来关闭。
接下来,如果Nginx设置为5s,浏览器将收到以下响应头。
2、DNS解析超时设置
30s:设置DNS解析超时时间,默认30s。 它配合...[valid=time]进行DNS域名解析。 在Nginx中使用域名时,需要考虑设置这两个参数。 在Nginx社区版中使用以下配置。
upstream backend {
server c0.3.cn;
server c1.3.cn;
}
上述两个域名在Nginx解析配置文件时会被解析为IP地址并记录下来。 当这两个域名对应的IP地址发生变化时,不会更新。 Nginx商业版支持动态更新。
3.代理超时设置
Nginx 配置如下所示。
upstream backend_server {
server 192.168.61.1:9080 max_fails=2 fail_timeout=10s weight=1;
server 192.168.61.1:9090 max_fails=2 fail_timeout=10s weight=1;
}
server {
……
location /test {
proxy_connect_timeout 5s;
proxy_read_timeout 5s;
proxy_send_timeout 5s;
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
proxy_pass http://backend_server;
add_header upstream_addr $upstream_addr;
}
}
定义了两个上游服务器192.168.61.1:9080(返回hello)和192.168.61.1:9090(返回)。
上述指令主要有三组配置:网络连接/读/写超时设置、失败重试机制设置、生存超时设置。
网络连接/读/写超时设置。
ttime:与后端/上游服务器建立连接的超时时间。 默认值为 60 秒。 该时间不得超过75s。
time:设置从后端/上游服务器读取响应的超时时间。 默认值为 60 秒。 该超时是指两次成功读取操作之间的时间,而不是读取整个响应正文的超时。 如果超过这里的超时时间,如果上游服务器没有发送任何响应,Nginx 就会关闭连接。
time:设置向后端/上游服务器发送请求的超时时间。 默认值为 60 秒。 该超时是指两次成功写入操作之间的时间,而不是发送整个请求的超时。 如果上游服务器在此超时时间内没有收到响应,Nginx 将关闭连接。
对于内网高并发业务,请根据需要调整这些参数。 例如内网服务TP999为1s,则可以设置连接超时为100~500毫秒,读取超时可以为1.5~3秒左右。
失败重试机制设置。
rror||||||||||off...:配置什么情况下需要请求下一个上游服务器重试。 默认为“”。 error 表示与上游服务器建立连接、写入请求或读取响应头时出现错误。 表示与上游服务器建立连接、写入请求或读取响应头时超时。 指示上游服务器返回空或不正确的响应标头。 表示上游服务器返回特定的状态码。 表示RFC-2616定义的非幂等HTTP方法(POST、LOCK、PATCH)。 还可以在失败后重试下一个上游服务器(即默认幂等方法GET、HEAD、PUT、、、TRACE只能重试。)。 off 表示禁用重试。
重试不可能无限制,所以需要下面两条指令来控制重试次数和重试超时时间。
:设置重试次数,默认0表示不限制。 注意,这个重试次数是指所有请求的次数(包括第一次和后续重试的总和)。
time:设置最大重试超时时间。 默认为0,表示没有限制。
即在该时间内允许三次重试。 如果超出这些设置之一,Nginx 也会结束重试并返回客户端响应(可能是错误代码)。
以下配置指示发生错误时重试的下一个上游服务器。 如果总重试时间超过6s或者重试一次,重试失败(因为之前已经发出过一次请求,所以仍然可以重试一次),Nginx结束重试,返回客户端响应。
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 6s;
proxy_next_upstream_tries 2;
4.保活超时设置
并且:当Nginx认为上游服务器不可用/无法生存时进行配置。 当上游服务器在规定时间内出现故障次数时,则认为上游服务器不可用/不活跃。 并在下次移除该节点(即请求不会转发到上游服务器)。
什么情况下算失败? 它是由,但是,无论如何配置,出现错误,ader都会被认为是失败。
例如192.168.61.1:=2=10s; 意味着如果在 10 秒内失败两次,则该节点将在接下来的 10 秒内被视为不可用/无法生存。 这种活体检测机制仅在访问上游服务器时采用惰性检查。 您可以配置主动检查。
设置为0表示不检查服务器是否可用(即始终认为可用)。 如果只剩下一台上游服务器,则该服务器不会被删除,并且永远不会被视为不可用。
5.超时设置
当我们这样做时,还请考虑设置以下网络连接/读/写超时。
lua_socket_connect_timeout 100ms;
lua_socket_send_timeout 200ms;
lua_socket_read_timeout 500ms;
使用lua的时候,我们会按照下面的策略进行重试。
if (status == 502 or status == 503 or status ==504) and request_time < 200 then
resp =capture(proxy_uri)
status =resp.status
body =resp.body
request_time = request_time + tonumber(var.request_time) * 1000
end
也就是说,如果状态码是500/502/503/504并且请求时间小于200毫秒,我们将重试。
参考
超时与重试机制(一)——《亿级流量》