这里先简单说下websocket与http的区别,websocket是长连接,而且客户端和服务端都可以主动给对方发送数据;而http是短连接的(当然可以是长连接http 1.1),但是只能是客户端主动发起请求,服务端做出响应。
在实际的生产环境中,一般要求多个websocket服务器必须具备高可用和高性能,这样webcoket就需要一个负载均衡层,本着有现有的轮子就使用现有轮子的原则,这里选择使用nginx做为websocket的反向代理和负载均衡器。虽然websocket和http协议不同,但是websocket与http握手兼容,可以使用http升级工具将http连接升级为websocket,这有助于websocket更容易的适应现有的软件架构,比如:websocket应用程序可以使用标准http的80和433端口,从而允许现有的防火墙策略。
websocket应用程序可以在客户端和服务器之间保持长时间运行的连接,从而有助于开发实时应用程序。用于将连接从http升级到websocket的http升级机制使用Upgrade和Connection头。反向代理服务器在支持websocket时面临一些挑战。一个是websocket是一个逐跳协议,因此当代理服务器拦截客户端的升级请求时,需要向后端服务器发送自己的升级请求,包括相应的头文件。此外,由于websocket连接长期存在,与http使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。
允许在客户机和后端服务器之间建立隧道,nginx支持websocket。对于nginx将升级请求从客户端发送到后台服务器,必须明确设置Upgrade和Connection头字段。
nginx开启websocket代理功能的部分配置示例如下:
upstream rtc {
server 10.59.37.20:50000;
server 10.59.37.21:50000;
ip_hash;
}
location / {
client_max_body_size 50m;
proxy_pass http://rtc;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-scheme $scheme;
proxy_read_timeout 1d;
proxy_send_timeout 1d;
}