一开始是在/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了。