解决upstream prematurely closed connection while reading response header from upstream问题(nginx)

问题描述:

使用docker部署了前端和nginx,前端有需求要使用websocket,所以在nginx中配置了websocket转发,配置如图:

server {
    listen       80;
    server_name  127.0.0.1;

    charset utf-8;
    
    # websocket转发
    location /websocket/ {
        proxy_pass http://websocket:3600;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $connection_upgrade;
    }}
}

发现报错upstream prematurely closed connection while reading response header from upstream,然后去网上找答案,有的说是ngxin缓存目录权限问题,有的说是 keepalive_timeout 时间设置太短,试了以后,发现均不能解决问题。

问题原因:

经过仔细排查,发现目标服务并没有收到转发,websocket服务需要的是http://ip:port/Infer/?token='abc',结果真实路径是http://ip:port/websocket/Infer/?token=‘abc’,网上查了那么多答案,没有一个人提到转发不对也可能造成这个错误,可能还是我太菜了,做前端太难了...      既然原因知道了,那解决很简单,就是让路径满足要求就行,修改为如下配置后websocket连接成功。

server {
    listen       80;
    server_name  127.0.0.1;

    charset utf-8;
    
    # websocket转发
    location /websocket/ {
        proxy_pass http://websocket:3600/;  #重点就是端口后的这个斜杠
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $connection_upgrade;
    }}
}

  知识延展:

上述问题,解决起来看似很简单,知识在proxy_pass路径后加 / ,那么这个斜杠到底该怎么用呢?规律如下:

原始请求:192.168.1.123:80/static/a.html
代理后ip: 192.168.2.321:81

# 情况1 location后没有/    转发网站没有/
实际转发后请求:192.168.2.321:81/static/a.html

# 情况2 location后有/     转发网站没有/
实际转发后请求:192.168.2.321:81/static/a.html


# 情况3 location后没有/    转发网站有/
实际转发后请求:192.168.2.321:81/a.html

192.168.1.123:80/static/a.html
# 情况4 location后有/      转发网站有/
实际转发后请求:192.168.2.321:81/a.html

#结论
proxy_pass后路径只要跟了斜杠,nginx转发时就会把location后对应的url部分去掉

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A-wliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值