在nginx中配置WebSocket的wss协议,包括需求背景、步骤和关键配置。由于小程序连接WebSocket必须使用wss协议,需要在服务器上部署项目并开通SSL证书。
为了配置Nginx以支持WebSocket的安全连接(WSS),需要在Nginx配置文件中设置SSL证书,并启用wss模块。以下是一个配置示例:
确保已经有了SSL证书和私钥文件。
在Nginx配置文件中,设置server块以监听443端口(HTTPS默认端口),并启用SSL。
启用ssl模块,并设置SSL证书路径。
启用http_wss_module模块,以便能够处理WebSocket的安全连接。
# 以下属性中,以ssl开头的属性表示与证书配置有关。
server {
# 配置HTTPS的默认访问端口为443。
# 如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
# 如果使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
listen 443 ssl;
# 填写证书绑定的域名
server_name your_domain.com;
# 填写证书文件名称
ssl_certificate /path/to/your/certificate.pem;
# 填写证书私钥文件名称
ssl_certificate_key /path/to/your/private.key;
ssl_session_timeout 5m;
#表示使用的加密套件的类型
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log logs/xxxxxx.net.access.log main;
location /ws {
proxy_pass http://your_backend;
proxy_http_version 1.1;
# ws 协议专用头
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
# 设置代理头部以传递真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
确保替换your_domain.com、证书路径和后端服务器地址为实际配置。
重载Nginx配置以应用更改:
sudo nginx -s reload
现在,Nginx应该已经配置好支持WebSocket的安全连接了。
注:Nginx 自从 1.3 版本就开始支持 WebSocket 了,并且可以为 WebSocket 应用程序做反向代理和负载均衡。
WebSocket 和 HTTP 协议不同,但是 WebSocket 中的握手和 HTTP 中的握手兼容,它使用 HTTP 中的 Upgrade 协议头将连接从 HTTP 升级到 WebSocket,当客户端发过来一个 Connection: Upgrade 请求头时,Nginx 是不知道的,所以,当 Nginx 代理服务器拦截到一个客户端发来的 Upgrade 请求时,需要显式来设置 Connection 、 Upgrade 头信息,并使用 101(交换协议)返回响应,在客户端和代理服务器、后端服务器之间建立隧道来支持 WebSocket。
当然,还需要注意一下,WebSockets 仍然受到 Nginx 缺省为60秒的 proxy_read_timeout 的影响。这意味着,如果你有一个程序使用了 WebSockets,但又可能超过60秒不发送任何数据的话,那你要么需要增加超时时间,要么实现一个 ping 的消息以保持联系。使用 ping 的解决方法有额外的好处,可以发现连接是否被意外关闭。