Nginx配置WebSocket与WSS代理问题排查
问题根源:端口与WebSocket协议的配置对应错误
你当前的Nginx配置里,两个server块的协议和端口对应关系完全搞反了:
- 15459端口的server块未启用SSL:这个端口只能处理普通的WebSocket(
ws://)连接——它的listen指令没有带ssl参数,也没有配置SSL证书。当你用WSS(wss://)连接这个端口时,客户端会发起SSL握手请求,但Nginx该端口根本不支持SSL,握手直接失败,导致连接无法建立。 - 15359端口的server块已启用SSL:这个端口是专门用来处理WSS(
wss://)连接的,你说“用普通WebSocket连接15359正常”大概率是表述混淆——实际上应该是用wss://连接15359能正常工作,而ws://连接15359理论上会因为SSL握手失败报错,可能你误把WSS当成了普通WebSocket。
修正方案
根据你的需求二选一即可:
方案1:让15459端口提供WSS服务
修改第一个server块,添加SSL相关配置:
server { listen 15459 ssl; # 加上ssl参数 ssl_certificate /etc/ssl/certs/topaz_wss.crt; ssl_certificate_key /etc/ssl/private/topaz_wss.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_session_timeout 5m; location / { proxy_pass http://localhost:15259; proxy_redirect off; proxy_pass_request_headers on; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection Upgrade; } }
如果不需要15359的WSS服务,可以删除第二个server块,或者把它改成普通WS端口(去掉ssl参数和证书配置)。
方案2:保持现有端口配置,修正连接方式
- 用
ws://连接15459端口(普通WebSocket) - 用
wss://连接15359端口(安全WebSocket)
额外提示
如果需要同时提供WS和WSS服务,当前两个server块的结构是可行的,只要确保:
- 普通WS端口的
listen不带ssl,无证书配置 - WSS端口的
listen带ssl,且配置好证书
内容的提问来源于stack exchange,提问作者user3161584
相关产品推荐
相关产品推荐

