Ratchet WebSocket与Apache共存时AH01084代理500错误求助
问题分析与解决方案
从错误日志的Error during SSL Handshake with remote server可以看出,核心问题有两个:
- 你的Ratchet服务器是无SSL的普通WebSocket服务,但Apache配置里用
https:///wss://协议代理到8445端口,导致SSL握手失败 - 全局
ProxyPass /会把所有请求转发到Ratchet,直接导致常规PHP站点无法访问
步骤1:保持Ratchet服务器配置不变
当前Ratchet代码无需修改,IoServer默认创建无SSL的WebSocket服务即可——让Apache作为SSL终结点,内部用普通HTTP与Ratchet通信。
步骤2:修正Apache虚拟主机配置
修改443端口的虚拟主机配置,仅代理WebSocket请求到Ratchet,同时解决SSL握手问题:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com SSLEngine on ProxyRequests Off Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem DocumentRoot /var/www/example.com/public_html ErrorLog /var/www/example.com/public_html/logs/error.log CustomLog /var/www/example.com/public_html/logs/access.log combined # 仅代理WebSocket专属路径到Ratchet ProxyPass /ws http://localhost:8445/ws ProxyPassReverse /ws http://localhost:8445/ws # WebSocket连接升级规则 RewriteEngine on RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC] RewriteRule ^/ws/(.*)$ ws://localhost:8445/ws/$1 [P,L] </VirtualHost> </IfModule>
关键调整说明:
- 移除
SSLProxyEngine等SSL代理相关配置,因为内部通信用HTTP,不需要SSL握手 - 用
http://localhost:8445替代https://example.com:8445,避免跨SSL协议的握手错误 - 指定
/ws作为WebSocket专属路径,确保常规PHP站点请求(如/index.php)仍由Apache正常处理 - 调整RewriteRule匹配
/ws路径,保证WebSocket升级请求正确转发
步骤3:修改前端WebSocket连接地址
确保前端代码使用正确的WebSocket路径:
const socket = new WebSocket('wss://example.com/ws');
额外检查项
- 确认Ratchet服务器正在运行并监听8445端口
- 检查服务器防火墙是否允许localhost的8445端口内部通信
- 重启Apache使配置生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者Manisha
相关产品推荐
相关产品推荐

