场景:我将前端部署在nginx上,然后客户端上传文件发送请求到后端接口上传文件,然后后端是将这个文件接收到,然后 在后端发送HTTP请求,然后去请求第三方服务器进行文件上传,然后这个时候报504,通过日志发现后端上传文件没得问题就是响应太慢了,然后我又去查了一下Nginx默认超时时间,发现是60秒,但是我们对接第三方那个服务器上传大文件实在是太慢了(甲方必须要求用第三方服务器),所以我就去修改Nginx配置文件,增加超时时间,重新启动Nginx发现解决了。
HTTP 504 Gateway Timeout错误表示请求超时。
通常是因为代理服务器(通常是NGINX或类似的服务器)在等待上游服务器(后端服务器)的响应时超过了设置的时间限制。具体来说,当客户端向NGINX网关服务器发送请求后,网关会向服务器发送请求,如果服务器在规定的时间内没有响应,网关就会返回504 Gateway Time-out的错误给客户端。
部署架构
以下是一些可能的解决方案:
1. 增加NGINX超时设置:
在您的NGINX配置中,可以调整以下两个指令的值,以便更长时间等待后端服务器的响应:
# 设置 NGINX 的代理连接超时为 600 秒
proxy_connect_timeout 600;# 设置 NGINX 的代理发送超时为 600 秒
proxy_send_timeout 600;# 设置 NGINX 的代理读取超时为 600 秒
proxy_read_timeout 600;# 设置 NGINX 的发送超时为 600 秒
send_timeout 600;
上述值以秒为单位,但是将这些值设置得太大可能导致代理服务器在等待响应时花费过多时间。
在 NGINX 配置文件中,可以在 http
、server
,或者 location
模块中设置超时值,具体取决于您的需求。以下是在这些模块中设置超时的示例:
在 http
模块中设置全局超时:
http {
# 全局超时设置
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;# 其他配置...
server {
# 服务器配置...
location / {
# 位置配置...
}
}
}
在 server
模块中设置服务器级别的超时:
http {
# 其他配置...
server {
# 服务器级别的超时设置
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;location / {
# 位置配置...
}
}
}
在 location
模块中设置特定位置的超时:
http {
# 其他配置...
server {
# 服务器配置...
location / {
# 特定位置的超时设置
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;# 其他位置配置...
}
}
}
这些超时值分别代表连接超时、发送超时、读取超时和发送响应超时。
2. 检查后端服务器:
确保后端服务器能够及时处理上传的文件并提供响应。您可能需要检查后端服务器的日志以查看是否有任何问题。
3. 分步骤处理:
考虑将文件上传和后续的HTTP请求处理分开,以便将文件上传到后端服务器后立即向前端发送响应,并在后台进行处理。此外,您可以使用异步处理或消息队列来处理文件上传后的操作,以避免对HTTP请求的立即响应产生过长的延迟。
4. 查看其他错误:
检查NGINX的错误日志以获取更多信息,以确定是否有其他问题导致504错误。您可以在NGINX的错误日志中查找与请求相关的信息。
5. 考虑负载均衡:
如果您的应用程序在处理大量请求时容易超时,考虑使用负载均衡来分散流量,以便多个后端服务器可以处理请求。