nginx代理websocket的一个问题

一开始是在/etc/nginx/conf.d/下这样添加配置的, 结果后端服务在返回101后就断开连接, 并没有完成握手:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream wsbackend {
    server 10.220.11.122:8888;
}

server
{   
    listen 12345;

    location / {
        proxy_pass http://wsbackend;
        proxy_redirect              off;
        proxy_set_header            Host $host;
        proxy_set_header            X-Real-IP $remote_addr;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

客户端ws加了重试机制, 结果一直在重连, nginx accesslog是这样的:

192.168.1.100 - - [07/Jul/2017:15:59:02 +0800] "GET /filecheck HTTP/1.1" 101 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/59.0.3071.109 Chrome/59.0.3071.109 Safari/537.36"

说明后端已升级协议可以接收websocket的请求了, 所以看起来也没有什么异常。
无意中查到这么一个参数:

#设置代理使用的HTTP协议版本。默认使用的版本是1.0,而1.1版本则推荐在使用keepalive连接时一起使用。
proxy_http_version 1.0 | 1.1

因为http1.0不支持keepalive特性, 所以有可能是后端返回101时就断开链接了。
所以在location块中加上这么一句:

proxy_http_version 1.1;

然后重启nginx, websocket代理就OK了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值