用nginx反向代理功能将WS转为加密websocket (wss)

         原来写的服务器端程序支持websocket非加密协议,即仅支持 ws://ip/file 形式的访问,现在网站的主协议变成了https了,再通过ws://协议来访问原服务器,浏览器阻止了。查找原因就是,如果一个网页的协议是https的,则内部的子连接必须也是安全套接字,如果原来是ws协议,则现在必须变为wss协议。

         由于时间紧,来不及修改原服务器了。发现nginx可以将ws协议通过反向代理的方式转为wss,目前苟且采用这种替代方案吧。

nginx配置成websocket的反向代理的配置文件如下 :

server {
	listen 443;
	server_name live.xxxxx.com;

	access_log logs/live.xxxxx.log main;

	ssl on;
	ssl_certificate /etc/live.xxxxx.com.cer;     # 这里是服务端的证书路径
	ssl_certificate_key /etc/live.xxxxx.com.key; # 这里是秘钥路径
	ssl_session_timeout 5m;
	ssl_session_cache shared:SSL:10m;
	ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
	#ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
	ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
	ssl_prefer_server_ciphers on;
	ssl_verify_client off;

	location /wss {
		proxy_redirect off;
		proxy_pass http://127.0.0.1:8006/live;
		proxy_http_version 1.1;
		proxy_set_header Connection "upgrade";
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Host $host;
		proxy_set_header Remote_addr $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
		proxy_read_timeout 100s;
	}
}

如下两行表示将http协议头升级为websocket协议:

proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;

 

<think>好的,我现在需要帮助用户配置Nginx反向代理三台服务器,并且支持WebSocket。首先,我得回忆一下之前用户提到的关于proxy_http_version和设置Upgrade头的内容。之前讨论过这些配置主要是为了协议升级,比如WebSocket,所以这次用户的问题应该是在实际配置中的具体应用。 用户的需求是反向代理三台服务器,并支持WebSocket。我需要先确定Nginx反向代理的基本结构,然后加入WebSocket的支持配置。首先,反向代理多台服务器通常涉及到upstream模块,用来定义后端服务器组。用户需要代理三台,所以应该在upstream块里列出这三个服务器的地址,可能还需要负载均衡策略,比如轮询或者ip_hash等。 接下来,支持WebSocket的关键配置是proxy_http_version 1.1,以及设置Upgrade和Connection头。这些配置必须放在对应的location块里,特别是处理WebSocket连接的路径。需要确保这些配置不会影响到其他普通HTTP请求,所以可能需要单独的location来匹配WebSocket的路径,比如/ws/。 另外,需要考虑负载均衡的问题。WebSocket是长连接,如果使用默认的轮询方式,可能会导致连接被分配到不同的后端服务器,而破坏会话的持续性。因此,可能需要使用ip_hash来保持客户端IP与后端服务器的对应关系,确保同一客户端的WebSocket连接总是打到同一台服务器上。不过,用户可能对负载均衡策略有不同需求,需要确认是否需要其他方法,比如least_conn或者hash。 然后,是具体的配置步骤。首先定义upstream,包含三台服务器的地址和端口。然后,在server块的location中配置proxy_pass到upstream的名称,并添加WebSocket所需的proxy参数。同时,可能需要调整超时时间,比如proxy_read_timeout,因为WebSocket连接通常会保持较长时间,避免超时断开。 还要注意其他相关配置,比如proxy_set_header Host $host,确保后端服务器能正确接收主机头。可能还需要禁用proxy_buffering,避免Nginx缓冲WebSocket的数据,导致通信延迟。 需要检查用户是否已经有现有的Nginx配置,避免重复或冲突。比如,如果用户已经有其他反向代理配置,需要将WebSocket的配置放在适当的位置,可能使用不同的location路径来区分。另外,SSL配置也是常见的,如果用户启用了HTTPS,需要在server块中配置SSL证书,并且确保WebSocketwss协议下工作。 测试配置是否正确也是重要的。用户可能需要使用工具如curl或者WebSocket客户端测试连接,查看握手是否功,或者检查Nginx的error日志来排查问题。常见的错误包括忘记添加proxy_http_version 1.1,或者Upgrade头没有正确设置,导致后端服务器无法升级协议。 最后,需要提醒用户重新加载或重启Nginx使配置生效,以及考虑安全性和性能优化,比如限制WebSocket连接的并发数,或者设置合适的超时时间。可能还需要考虑高可用性,比如后端服务器的健康检查,但Nginx的upstream默认有健康检查机制,可能需要额外模块或配置。</think>以下是配置Nginx反向代理三台服务器并支持WebSocket的完整方案: --- ### 一、基础架构示意图 ```text 客户端 │ │ HTTPS/WSSNginx (负载均衡器) │ ├──▶ 后端服务器1 (ws://192.168.1.101:8080) ├──▶ 后端服务器2 (ws://192.168.1.102:8080) └──▶ 后端服务器3 (ws://192.168.1.103:8080) ``` --- ### 二、完整配置示例 ```nginx # 定义上游服务器组(三台服务器) upstream backend_websocket { # 使用ip_hash保持会话粘性(WebSocket需要长连接) ip_hash; server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; } server { listen 80; listen 443 ssl http2; server_name your-domain.com; # SSL证书配置(如启用HTTPS) ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; # WebSocket专用路由配置 location /ws/ { proxy_pass http://backend_websocket; # 核心WebSocket支持配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 增强配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 超时控制(根据业务需求调整) proxy_read_timeout 3600s; proxy_send_timeout 3600s; } # 普通HTTP请求路由(可选) location / { proxy_pass http://backend_websocket; proxy_set_header Host $host; # 不需要WebSocket特殊配置 } } ``` --- ### 三、关键配置解析 #### 1. **负载均衡策略选择** ```nginx upstream backend_websocket { ip_hash; # 会话保持 server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; } ``` - **`ip_hash`的作用**: WebSocket需要保持长连接,使用客户端IP哈希算法确保同一客户端的请求始终路由到同一后端服务器 - **替代方案**: 如果后端服务器有状态共享,可使用`hash $http_authorization`等自定义哈希键 --- #### 2. **WebSocket协议支持配置** ```nginx proxy_http_version 1.1; # 强制使用HTTP/1.1 proxy_set_header Upgrade $http_upgrade; # 传递升级头 proxy_set_header Connection "upgrade"; # 设置连接类型 ``` --- #### 3. 增强头部传递 ```nginx proxy_set_header Host $host; # 传递原始域名 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链信息 ``` --- ### 四、配置验证步骤 #### 1. 测试WebSocket连接 ```bash # 使用wscat工具测试 npm install -g wscat wscat -c wss://your-domain.com/ws/chat ``` #### 2. 查看Nginx日志 ```bash tail -f /var/log/nginx/access.log # 正常连接应显示101状态码 ``` #### 3. 后端服务器验证 检查后端服务器的WebSocket握手日志,确认接收到正确的`Upgrade`头 --- ### 五、负载均衡策略对比 | 策略类型 | 适用场景 | WebSocket支持建议 | |----------------|-------------------------|------------------| | 轮询 (默认) | 无状态服务 | 不推荐 ❌ | | ip_hash | 需要会话保持 | 推荐 ✔️ | | least_conn | 负载不均时优化 | 谨慎使用 ⚠️ | | 一致性哈希 | 自定义会话保持 | 推荐 ✔️ | --- ### 六、常见问题处理 #### 1. **连接频繁断开** ```nginx # 调整超时配置 proxy_connect_timeout 60s; proxy_read_timeout 3600s; # 保持1小时活动 proxy_send_timeout 3600s; keepalive_timeout 3600s; ``` #### 2. **跨域问题** ```nginx add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Upgrade,Connection'; ``` #### 3. **SSL证书配置** ```nginx # 现代加密配置建议 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; ``` --- ### 七、性能优化建议 1. **内核参数调整**: ```bash # 增加最大文件描述符数 echo "fs.file-max = 100000" >> /etc/sysctl.conf sysctl -p ``` 2. **Nginx工作进程配置**: ```nginx worker_processes auto; # 自动匹配CPU核心数 worker_connections 10240; # 单进程连接数 ``` 3. **启用缓存(非必要不推荐)**: ```nginx proxy_buffering off; # WebSocket必须关闭缓冲 ``` --- 按照此方案配置后,Nginx即可实现: 1. 三台后端服务器的负载均衡 2. WebSocket协议的全功能支持 3. 会话保持和长连接优化 4. 生产级别的安全加固 配置完后需执行 `nginx -t` 测试配置,然后使用 `systemctl reload nginx` 应用新配置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值