Plesk服务器上带Apache代理与SSL的Websocket(Ratchet/ZeroMQ)配置故障
解决WebSocket over SSL(WSS)反向代理超时问题
看起来你踩了几个反向代理WebSocket over SSL的常见坑,咱们一步步来排查解决:
核心问题分析
你的Ratchet服务运行在8888端口,是纯WebSocket(ws://)服务,不支持SSL/TLS,但你在Apache代理配置里错误地用了https://或wss://指向这个端口,导致Apache无法和后端建立正常连接,最终触发504超时。另外之前的No protocol handler报错,是因为mod_proxy_wstunnel的配置写法不对,或者没有真正生效。
解决方案步骤
1. 修正Apache反向代理配置
把ProxyPass规则改成用ws://指向后端的非SSL服务,同时添加WebSocket握手所需的头处理,确保Apache正确转发Upgrade请求:
SSLProxyEngine on ProxyRequests Off ProxyTimeout 3600 # 延长超时时间,适配WebSocket长连接特性 SetEnv proxy-initial-not-pooled 1 # 优先处理WebSocket握手请求 RewriteEngine On RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /wss/(.*) ws://localhost:8888/$1 [P,L] # 常规反向代理回退(非WebSocket请求) ProxyPass /wss/ ws://localhost:8888/ ProxyPassReverse /wss/ ws://localhost:8888/
- 为什么用
ws://localhost:8888?因为后端Ratchet只监听纯WS协议,Apache作为SSL终止层,负责把客户端的wss://请求转换成ws://发给后端。 ProxyTimeout设置长一点,避免默认超时导致长连接被断开。
2. 确认mod_proxy_wstunnel已正确启用
你提到已经启用了该模块,但之前的报错提示可能没真正生效:
- 登录Plesk > 工具与设置 > Apache Web服务器,查看已启用的模块列表,确保
proxy_wstunnel在其中。 - 如果是手动配置,检查Apache配置文件中是否有
LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so(Ubuntu默认路径),且没有被注释。
3. 避免Plesk覆盖自定义配置
因为使用Plesk面板,直接修改Apache主配置文件可能会被Plesk的配置生成工具覆盖,正确的做法是:
- 登录Plesk > 你的域名 > Apache & nginx设置 > 额外的Apache指令,把上面的配置粘贴到这里,保存后Plesk会自动应用,不会被后续更新覆盖。
4. 处理Nginx前端代理的情况
你提到响应头里有Server: nginx,说明Plesk可能启用了Nginx作为前端反向代理到Apache。这种情况下,Nginx也需要添加WebSocket转发规则,否则请求会在Nginx层被拦截:
location /wss/ { proxy_pass http://localhost:8888; 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_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600; }
在Plesk中,你可以在域名 > Apache & nginx设置 > 额外的nginx指令中添加这段配置。
5. 测试配置
- 重启Apache和Nginx:
sudo systemctl restart apache2 nginx - 先测试后端纯WS是否正常:
wscat -c ws://my.domain.net:8888(如果没装wscat,可通过npm install -g wscat安装) - 再测试WSS连接:
wscat -c wss://my.domain.net/wss
为什么之前的配置会失败?
- 用
https://my.domain.net:8888/:后端8888端口没有配置SSL证书,Apache尝试建立HTTPS连接时会被拒绝,导致连接中断触发504。 - 用
wss://my.domain.net:8888/:后端不支持WSS协议,且mod_proxy_wstunnel需要配合Rewrite规则处理Upgrade头,直接写ProxyPass无法正确识别WebSocket请求。
内容的提问来源于stack exchange,提问作者OPL




