Nginx请求超时
前段时间做一个需求,就是从页面下载excel的需求,数据都是存在数据库里,开始咔咔一顿AI写代码,写完自己本地启动测试,ok,一切都是那么美好,接口正常返回数据,结果,结果问题就来了,上到测试环境,从页面点击下载的时候,报错,F12一看接口竟然返回了404!
先说一下我们的项目的架构:
前端首先请求Nginx,然后 NG 里做了请求代理转发到gateway,由gateway 路由转发到具体的service
刚开始以为是 NG的端口映射错误导致请求无法找到具体端口,所以去Linux系统里查看 Nginx 的映射的端口,结果没问题,端口映射正确,然后检查 NG 代理转发到gateway的端口,ok,也没问题,奇了怪了,端口映射都正确,为什么报404呢?
非常郁闷之际,我在接口第一行里打了一行log,编译,发布docker,重启,再次测试,检查log,what??? log竟然打印了,但是接口仍然返回404,这就更奇怪了
思考半天,这时候我考虑到由于是下载数据库里的全量数据,数据量比较大,接口在我本地调用时间大概1分钟多一点点(注意这里是关键),我在想有没有可能哪里超时导致的问题,所以首先查询第一站的配置,NGINX 的配置,当时还年轻,对NG还不是特别熟悉,看到 keepalive = 65,没问题啊! hhhhhh~~~~,大于1分钟,完全够用了,但是我仍然不死心,调大到了80,reload NG 配置,果不其然,错误仍然存在!
紧接着查询gateway的配置,然而并没有配置超时时间,这里在当时持续输出国粹中~~~
最后在网上翻山越岭,最终在一个博客里找到了答案,哈哈哈哈哈
问题分析
您的接口返回需要约1分钟,但 Nginx 默认的代理超时设置是60秒,这会导致超时。虽然您设置了 keepalive_timeout 80;,但这个参数控制的是客户端与Nginx的连接保持时间,而不是Nginx与后端服务的超时时间。
解决方案
在 location /user/ 块中添加代理超时配置:
location /user/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://172.26.6.150:6532/;# 添加以下超时配置proxy_connect_timeout 120s; # 后端连接超时proxy_send_timeout 120s; # 后端发送超时 proxy_read_timeout 120s; # 后端响应读取超时(关键参数)
}
具体操作步骤
-
修改 Nginx 配置:
# 进入容器编辑配置文件 docker exec -it hbjz-nginx /bin/bash vi /etc/nginx/nginx.conf -
重新加载配置:
# 在容器内重载Nginx nginx -s reload# 或者重启容器 docker restart hbjz-nginx
