Nginx/Tomcat解决请求比较耗时请求时发生504GatewayTimeout/ClientAbortException的问题

2021-05-28 202点热度 0人点赞 0条评论

一般的web服务器(Nginx)或者应用服务器(Tomcat)的默认请求,都是有默认超时设置的(一般默认60秒),超过这个时间我们的代码没有返回结果,用户端就会收到报错:504 GatewayTimeout, Tomcat应用服务器里,也可能收到ClientAbortException(Borken Pipe)等错误。

有时候确实有一些请求比较耗时(例如生成统计报表等),在1分钟内还没有处理好,程序或者nginx那边就报错了,所以有时候需要为Nginx或者Tomcat修改默认超时设置。

Nginx设置请求超时

nginx设置超时的设置是(以设置300s,5分钟为例,修改后重启nginx生效):

# 可以设置在http下(相当于全局)
http {
   # 其他配置省略
   proxy_read_timeout 300s;
   proxy_connect_timeout 300s;
   proxy_send_timeout 300s;
   # 其他配置省略
}

# 也可以设置在server下,只针对某一个域名
server {
    # 其他配置省略
    proxy_read_timeout 300s;
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    # 其他配置省略
}

# 还可以只针对某一个特定的url设置
# 还可以设置更大一些值或者单位,比如
# proxy_connect_timeout 5m; #5分钟
# proxy_connect_timeout 2h; #2小时
# proxy_connect_timeout 2d; #2天
location /upload {
    # 其他配置省略
    proxy_read_timeout 300s;
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    # 其他配置省略
}

Tomcat设置超时

Tomcat的超时设置在/tomcat/conf/server.xml下

找到Connector里面的connectionTimeout="20000",单位是毫秒,修改后重启Tomcat生效,如下

<!--connectionTimeout="20000" 默认20秒有点少,改成300000,也就是5分钟,或者-1表示用不超时,-->
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="300000"
               maxHttpHeaderSize="65536"
               redirectPort="8443" URIEncoding="UTF-8" maxThreads="800" acceptCount="1000"/>

SpringBoot中的应用服务器设置超时时间

请看:https://blog.terrynow.com/2021/06/22/spring-boot-rest-controller-request-timeout/

admin

这个人很懒,什么都没留下

文章评论

*

code