You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动