如何使用NGINX代理WSS WebSockets
说明
WebSocket允许客户端和服务器之间的双向持久通信通道。像任何其他HTTP请求一样,WebSocket可以是安全(WSS)或者不安全(WS)的。在本教程中,将向我们展示如何配置NGINX来代理WSS连接。
证书
可信证书
来自受信任来源的任何证书密钥对都将起作用。将证书文件放在NGINX可以访问的安全位置。我们将使用处理WebSocket连接的Nginx配置文件指向密钥和证书文件。
创建自签名证书
在测试解决方案之外,强烈建议不要使用自签名证书。但是,由于可能需要证书进行测试,因此以下说明将向我们展示如何创建密钥对。
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 --nodes
配置安全的WebSocket代理
为了将WWS请求代理到后端WSS服务,必须将NGINX配置为侦听安全端口。就像使用NGINX来为Web应用程序服务器配置SSL一样,必须配置ssl证书和证书密钥。
以下示例nginx.conf添加了使用名为cert.pem的证书文件和名为key.pem的密钥文件。可以使用ssl_protocols指令显式设置可接受的协议,并使用ssl_ciphers指令设置允许的密码。
http { server { listen 443 ssl; server_name ws.theitroad.com ssl_certificate cert.pem; ssl_certificate_key key.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass https://ws-backend; proxy_ssl_certificate /etc/ssl/certs/cert.pem; proxy_ssl_certificate_key /etc/ssl/private/key.pem; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } upstream ws-backend { # enable sticky session based on IP ip_hash; server server01:3000; server server02:3000; server server03:3000; } }
连接升级
上面的示例配置将连接设置为"升级",这是代理连接切换到WS和WSS协议的方式。两个proxy_set_header指令是升级连接的对象。
此外,WS和WSS连接仅在HTTP 1.1上受支持,因此另一个名为proxy_http_version的指令将HTTP版本设置为1.1. 没有它,HTTP 1.0可能会尝试使用WebSockets。
上游服务器
上游可以根据需要配置尽可能多的上游服务器。但是,如果连接是有状态的,则必须使用ip_hash目录。
该示例包含三个服务器池,分别名为server01,server02和server03. 所有这些都在端口3000上进行侦听。默认的负载平衡算法是循环的,因此新的传入连接将按顺序连接到服务器。
例如,clientA将连接到server01,clientB将连接到server02,clientC将连接到server03,最后clientD将连接到server01.
ip_hash伪指令基于客户端的IP地址启用粘性会话。这样可确保来自IP的所有请求均由同一下游服务器处理。
虽然这对于保持静态的客户端非常有效,但诸如手机之类的非静态客户端可能会切换IP地址。粘性会话将失败,因为客户端的IP已更改,这将导致会话丢失。
NGINX Plus允许创建会话cookie,它是粘性会话的更好候选者。