站点部署情况:
前端vue、后端接口API thinkphp6.1,
采用宝塔面板部署,前端后端均强制使用https协议;
前端站点配置反向代理访问api;
症状:
前端页面正常打开,访问api提示服务器错误,浏览器Devtools查看网络选项卡,发现所有反向代理的post请求都返回的502 Bad xxxx;
解决过程
- 打开api站点添加测试路由直接访问,发现正常返回数据 (说明api站点没有问题)
- 查看前端网站日志,日志提示:[error] 27383#0: *63259 upstream prematurely closed connection while reading response header from upstream,
- 查看api站点WAF,关闭站点WAF 访问恢复正常
- 去掉所有WAF设置和规则,打开WAF,又提示502
- 修改前端站点反向代理配置文件加入超时配置如下,重启Nginx问题解决
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
proxy_buffering off;
- 恢复所有WAF设置和规则,开启WAF,依旧正常,至此问题解决
原因
upstream prematurely closed connection
表示 后端服务(upstream,即 xxx.xxx.xxx.xxx:443)在 Nginx 还没读到完整的响应头时就断开了连接。
Nginx 是作为反向代理,把请求转发到 upstream,但后端还没返回正确的 HTTP 响应头就关闭了连接,所以 Nginx 报错。
所以考虑调整反向代理超时时间解决