一、Nginx代理的方式
客户端和代理服务器建立连接并发送请求,代理服务器端接收客户端的请求后与具体的服务器建立连接,并把请求分发给服务器进行处理,最后再将服务器的响应结果反馈给客户端。
二、Nginx如何支持WebSocket
WebSocket 和HTTP虽然是不同协议,但是两者“握手”方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。如下图所示:
三、Http升级为WebSocket
因为WebSocket协议是一个hop-by-hop协议(此类头部字段只对单次转发有效,会因为转发给缓存/代理服务器而失效),为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须被显式的设置。
代理服务器分别与客户端和服务器建立连接,由于WebSocket连接是长时间保持的,所以代理服务器需要允许这些连接处于打开状态,而不是像对待HTTP使用的短连接那样将其关闭。
可以通过修改Nginx的配置文件方式解决此问题,代理请求后端服务器的请求头设置:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
1、map是根据客户端请求中 $http_upgrade 的值来构造改变 $connection_upgrade 的值,即根据变量 $http_upgrade 的值和{} 里规则创建新的变量 $connection_upgrade并赋值。
2、HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头;为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。
四、总结
通过Http升级机制将Http升级为WebSocket。Nginx代理服务器通过修改配置的方式解决了WebSocket属于hop-by-hop协议的问题、并通过保持分别与客户端和服务端的连接一直处于打开状态从而实现WebSokcet的代理。