Nginx 控制超时时间

在 Nginx 中控制超时时间主要通过修改Nginx的配置文件来实现,这涉及到几个关键参数的设置,包括客户端请求的超时时间、代理服务器的超时时间以及连接超时时间。以下是一些常用的配置指令及其说明:

一、请求超时时间设置

请求超时时间是指Nginx等待请求处理的最长时间,如果超时,则产生504 Gateway Time-out错误。在实际使用中,可以通过以下三个设置来控制请求超时时间。

1、proxy_connect_timeout

指定与代理服务器的连接超时时间,包括TCP连接的建立和SOCKET连接的时间。在默认情况下,Nginx没有设置此选项,因此连接时间不会超时。

# 设置与代理服务器建立连接的超时时间为30秒
proxy_connect_timeout 30s;
2、proxy_send_timeout

指定向后端服务器发送请求的超时时间,包括发送请求头和请求体的时间。如果后端服务器不能在此时间内响应,则代理服务器会返回504错误。

# 设置将请求发送给代理服务器的超时时间为60秒
proxy_send_timeout 60s;
3、proxy_read_timeout

指定代理服务器接收响应的超时时间。如果后端服务器不能在这个时间内返回响应,则Nginx会关闭连接,同时返回一个504 Gateway Time-out 错误

# 设置从代理服务器读取响应的超时时间为120秒。
proxy_read_timeout 120s;
4、send_timeout

服务端向客户端传输数据的超时时间, 默认60s, 如果连续的60s内客户端没有收到1个字节, 连接关闭。如果咱们返回的数据复杂,很耗时,就将该值设置大些。注意该时间指准备过程,不是传输过程(下载电影属于传输过程,时间再长也不会断开链接)

# 服务端向客户端传输数据的超时时间为120秒。
send_timeout 120s;

二、FastCGI 超时时间设置

Nginx还支持FastCGI协议,而FastCGI超时时间也需要根据实际情况进行设置,否则也会产生类似的错误提示。

1、fastcgi_connect_timeout

指定与FastCGI应用程序的连接超时时间,与proxy_connect_timeout具有相同的语法和功能。

# 指定与FastCGI应用程序的连接超时时间为5秒
fastcgi_connect_timeout 5s;
2、fastcgi_send_timeout

指定向FastCGI服务器发送请求的超时时间,与proxy_send_timeout具有相同的语法和功能。

# 指定向FastCGI服务器发送请求的超时时间为10秒
fastcgi_send_timeout 10s;
3、fastcgi_read_timeout

指定FastCGI服务器响应的超时时间,与proxy_read_timeout具有相同的语法和功能。

# 指定FastCGI服务器响应的超时时间为10秒
fastcgi_read_timeout 10s;

三、Keepalive 超时时间设置

Keepalive超时时间是指 HTTP Keepalive 连接的最大保持时间,如果超时,则连接会被关闭。Keepalive连接可以避免多次建立TCP连接,从而提高Web应用的性能。在Nginx中,可以通过以下两个选项来设置Keepalive超时时间。

1、keepalive_timeout

指定客户端与代理服务器之间的连接保持时间,默认75s,通常keepalive_timeout应该比client_body_timeout大。如果客户端在超时时间内没有发送新的请求,则连接会被关闭。

# 客户端与代理服务器之间的长连接超时时间为60秒
keepalive_timeout 60s;
2、keepalive_requests

指定每个 Keepalive 连接的最大请求次数。如果超过此数量,则连接会被关闭

# 指定每个 Keepalive 连接的最大请求次数为100
keepalive_requests 100;

四、Gzip 超时时间设置

如果启用了Nginx的gzip压缩功能,则还需要设置gzip超时时间,以便在文件较大或网络较慢时避免压缩失败。可以使用以下选项进行设置。

1、gzip_vary

gzip_vary指定浏览器在请求相同资源时是否应考虑Accept-Encoding请求头。启用此选项时,Nginx将在HTTP响应头中添加 Vary: Accept-Encoding,以表明压缩后的内容是针对特定的Accept-Encoding请求头进行的。这样可以确保缓存服务器正确地缓存压缩后的内容。

gzip_vary on;
2、gzip_comp_level

gzip_comp_level指定压缩级别,取值范围是1~9,级别越高,则压缩比越高,但压缩时间也越长。

gzip_comp_level 6;
3、gzip_buffers

gzip_buffers指定用于压缩的内存缓冲区的大小。第一个参数指定缓冲区的数量,第二个参数指定每个缓冲区的大小。在压缩大文件时,如果缓冲区太小,则会产生gzip write error (0 bytes written)错误

gzip_buffers 16 8k;

五、缓存超时时间设置

缓存超时时间是指Nginx缓存结果的最长时间,超过此时间后,缓存将被视为无效,并且需要重新生成缓存。在Nginx中,可以通过以下两个选项来设置缓存超时时间。

1、proxy_cache_path

指定缓存文件的路径和缓存区的大小。levels=1:2表示在缓存目录中创建两级子目录,以减少单个目录中文件的数量。keys_zone指定缓存区名称和大小。

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
2、proxy_cache_valid

指定在没有新的响应时,缓存文件可以保持有效的时间。第一个参数可以是HTTP状态码或状态码范围,第二个参数是子状态码,第三个参数是缓存的有效时间。在本例中,200和304状态码的响应将被缓存12小时

proxy_cache_valid 200 304 12h;

六、Nginx Client 参数设置

  • client_max_body_size

默认 1M,表示客户端请求服务器最大允许大小,若超过所设定的大小,返回413错误。

  • client_body_buffer_size

Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中

  • client_body_temp

大于client_body_buffer_size临时文件指定路径,默认该路径值是/tmp/

  • client_header_timeout

读取请求头的超时时间,客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

  • client_body_timeout

读取请求实体的超时时间,指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。

接收客户端body超时, 默认60s, 如果连续的60s内没有收到客户端的1个字节, 返回408

四、优化 Nginx 请求超时配置的最佳实践

4.1 根据实际情况调整超时配置

Nginx 的超时配置应根据 Web 应用的实际需求进行调整。例如,处理大文件上传或下载时,可能需要增加 client_body_timeoutsend_timeout,以避免请求超时。对于需要频繁查询数据库或进行复杂计算的后端服务,可以增加 proxy_read_timeout 来确保请求能够顺利处理。

4.2 配置合理的缓存和负载均衡

通过合理配置缓存机制和负载均衡策略,可以减少请求超时的发生。例如,Nginx 可以缓存静态内容和代理内容,减少请求对后端服务器的依赖。此外,负载均衡可以将流量分配到多个健康的服务器上,避免某台服务器过载导致超时。

4.3 监控和日志分析

定期检查 Nginx 的错误日志,并进行超时问题的监控。通过日志分析,能够及时发现超时问题的根源,帮助管理员优化系统配置和性能。

示例配置

以下是一个示例配置,展示了如何设置这些超时参数:

server {
    listen 80;
    server_name example.com;

    # 设置客户端请求头的读取超时时间为60秒
    client_header_timeout 60s;

    # 设置客户端请求体的读取超时时间为60秒
    client_body_timeout 60s;

    # 设置客户端向服务器发送请求并且等待服务器返回数据的时间为120秒。
    send_timeout 300s;

    # 设置与代理服务器建立连接的超时时间为30秒
    proxy_connect_timeout 30s;

    # 设置将请求发送给代理服务器的超时时间为60秒
    proxy_send_timeout 60s;

    # 设置从代理服务器读取响应的超时时间为120秒
    proxy_read_timeout 120s;

    # 设置长连接的超时时间为60秒
    keepalive_timeout 60s;

    location / {
        proxy_pass http://backend-server;
    }
}
作者:Jeebiz  创建时间:2025-01-15 09:12
最后编辑:Jeebiz  更新时间:2025-01-15 10:10