nginx访问返回504问题及解决
作者:liujiangxu
nginx访问返回504
现象
nginx后端代理为报表服务,错误日志大量出现上游服务超时,页面访问也会出现504返回,查看后发现服务本身没问题,问题着重在nginx本身,报表服务本身属于大查询,返回较慢。
nginx默认本身后端超时为60S,大查询的返回大于60S所以会有几率出现504请求失败
报错
2022/08/05 13:00:24 [error] 3389#e: *1092213 upstream timed out (110: Connection timed out) while reading upstream, client: 10.6. 18.19, server: localhost, request: “POST /rcenter/rpt/api/showReport HTTP/1.1”, upstream: “http://10.6.6.65:8880/rcenter/rpt/api/showReport” host: “10.6.6.67”
处理
增加后端超时时长参数
参数 | 详解 |
---|---|
proxy_connect_timeout | 与后端/上游服务器建立连接的超时时间 |
proxy_send_timeout | 与后端/上游服务器发送请求的超时时间 |
proxy_read_timeout | 与后端/上游服务器读取响应的超时时间 |
server { listen 80; server_name localhost; location / { root html; proxy_pass http://report; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600;
nginx504网关超时解决思路
环境
前端:nginx作代理
后端:nginx+php(耳朵分发服务)
问题:整套服务搭建完成之后,将打包好的ios包进行上传到分发服务器时,包传递完毕之后页面无法自动跳转
上述进度条走完之后,页面无法自动跳转。
解决思路
刚开始,以为是php的代码设置了超时时间,然后各种改代码,可是没什么卵用;然后以为是php有问题,然后修改php的超时时间,也没什么卵用。
最后,F12查看页面具体情况,发现:
原来是网关超时,应该是代理的nginx和后端nginx之间传输数据时发生超时。
最后,在前端nginx的配置文件中加入如下配置:
proxy_read_timeout 300
说明 该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。
这个时间不是获得整个response的时间,而是两次reading操作的时间。
如果后端有大文件传输的需求时,需要将此值调大一些。
proxy_send_timeout 300
说明 这个指定设置了发送请求给upstream服务器的超时时间。
超时设置不是为了整个发送期间,而是在两次write操作期间。
如果超时后,upstream没有收到新的数据,nginx会关闭连接
以上两个参数默认是60s超时,,由于上传的ios包需要的时间超过了60s,导致网关超时。
至此,问题得到解决。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。