为了适应大量消息推送的业务场景, 需要多个 webSocket 服务器来保障性能和高可用性, 因此需要使用 Nginx 对 WebSocket 服务器进行反向代理负载均衡. 本文将对以下四点做出讨论:
代理服务器获取流量的方式
Nginx 代理的方式
Nginx 如何支持 WebSocket
Nginx 配置 WebSocket 方式
一, 代理服务器获取流量的方式
客户端通常都会直接与 Web 服务器进行通信. 那么当使用代理服务器作为客户端和服务器两者间一个 "中介" 时, 代理服务器获取流量的方式有以下四种方式:
修改客户端: 将客户端配置为使用代理服务器, 那么客户端会直接将 HTTP 请求有意的发送到代理服务器上.
修改网络: 网络基础设备可以通过若干种技术手段, 在客户端不知情或没有参与的情况下, 拦截网络流量并将其导入代理, 这种代理称为拦截代理.
修改 DNS 命名空间: 放在 Web 服务器之前的代理服务器, 替代物, 会直接假扮 Web 服务器的名字和 IP 地址
修改 Web 服务器: 将 Web 服务器配置为向客户端发送一条 HTTP 重定向命令, 将客户端的请求重定向到代理服务器上.
二, Nginx 代理的方式
客户端和代理服务器建立连接并发送请求, 代理服务器端接收客户端的请求后与具体的服务器建立连接, 并把请求分发给服务器进行处理, 最后再将服务器的响应结果反馈给客户端.
三, Nginx 如何支持 WebSocket
WebSocket 和 HTTP 虽然是不同协议, 但是两者 "握手" 方式兼容. 通过 HTTP 升级机制, 使用 HTTP 的 Upgrade 和 Connection 协议头的方式可以将连接从 HTTP 升级为 WebSocket. 如下图所示
Http 升级为 WebSocket
因为 WebSocket 协议是一个 hop-by-hop 协议 (此类头部字段只对单次转发有效. 会因为转发给缓存 / 代理服务器而失效), 为了让 Nginx 代理服务器可以将来自客户端的 Upgrade 请求发送到后端服务器, 要求 Upgrade 和 Connection 的头信息必须被显式的设置. 可以通过下文将要讲解的修改 Nginx 的配置文件方式解决此问题.
代理服务器分别与客户端和服务器建立连接, 由于 WebSocket 连接是长时间保持的, 所以代理服务器需要允许这些连接处于打开状态, 而不是像对待 HTTP 使用的短连接那样将其关闭.
四, Nginx 配置 Websocket 方式
通过修改 nginx.conf 配置, 如下图所示
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 的代理.
来源: http://server.51cto.com/sOS-602193.htm