作者回复: 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协议格式的详细讲解。
作者回复: nginx做不到,因为websocket自身只是想把TCP暴露给应用,因此它只是定义了一个frame的概念;Nginx不解析Frame,只是把升级后的WS协议作为TCP双向透传。
作者回复: 数据都是在一条建立好的TCP连接上传递的,WS连接由哪个worker进程accept,就会由它按照负载均衡算法例如iphash选择上游一台server,建立好连接后,就会在这两条连接间接力传递数据。
作者回复: 将_read_timeout、send_timeout调大,或者用stream四层负载均衡,试试看
作者回复: 支持,很多支持实时刷新的网站,都是用websocket完成的,但它通常是用javascript发起的,你直接用URL访问的是HTML页面。
作者回复: ^_^,89课对proxy_pass指令有详细的介绍
作者回复: proxy_pass指令后是否加url,会导致与location后的URL前缀产生关联,产生不同的访问上游的URL。具体可以参见89课。
作者回复: 可以
作者回复: 1、ws只是http的升级协议,换成https也是一样。你可以参考《Web协议详解与抓包实战》第44课,看看http/1.1怎么升级到websocket,这与https无关。 2、nginx的http_proxy会将下游协议ssl剥离,你需要再次加上ssl,请参看96课。