作者回复: nginx做不到,因为websocket自身只是想把TCP暴露给应用,因此它只是定义了一个frame的概念;Nginx不解析Frame,只是把升级后的WS协议作为TCP双向透传。
作者回复: 数据都是在一条建立好的TCP连接上传递的,WS连接由哪个worker进程accept,就会由它按照负载均衡算法例如iphash选择上游一台server,建立好连接后,就会在这两条连接间接力传递数据。
作者回复: 1、ws只是http的升级协议,换成https也是一样。你可以参考《Web协议详解与抓包实战》第44课,看看http/1.1怎么升级到websocket,这与https无关。
2、nginx的http_proxy会将下游协议ssl剥离,你需要再次加上ssl,请参看96课。
作者回复: Websocket升级失败,需要查看以下头部是否传递:
1、Sec-WebSocket-Version是否存在
2、Connection: keep-alive, Upgrade
3、Upgrade: websocket
建议抓包查看,你也可以学习下我的《Web协议详解与抓包实战》第44课:websocket协议升级时的必要头部。
作者回复: 因为proxy_pass不接受wss语法 ,原因是ws是从http升级过去的,升级完成后其实在Nginx看来就退化成TCP连接,不用那么复杂。在《Web协议详解与抓包实战》第2部分课程中,有对Websocket协议格式的详细讲解。