如何正确配置Apache2以实现Websocket SSL(wss)代理?
问题描述
在AWS中部署了应用及soketi.app服务器,所有服务位于负载均衡之后。应用可正常访问(443流量转发至实例的8788端口),但通过wss(SSL)协议连接soketi服务器时失败,报错:Could not connect to wss://mydomain.com/6001/app/blahblah。目标是将Apache配置为websocket代理,而非让浏览器与websocket服务器直接建立SSL连接。
相关配置文件如下:
Apache2 000-default.conf(已安装并启用必要的Apache模块)
<VirtualHost *:8788> ServerAdmin webmaster@localhost DocumentRoot /var/www/public/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/public/> Options All AllowOverride All order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/error.log LogLevel warn </VirtualHost> <VirtualHost *:6001> ProxyPass /app ws://127.0.0.1:6001/app ProxyPassReverse /app ws://127.0.0.1:6001/app </VirtualHost>
soketi-config.json
{ "debug": true, "appManager.array.apps": [ { "id": "blah", "key": "blah", "secret": "blah" } ] }
解决方案
按以下步骤调整配置:
- 合并VirtualHost配置,统一处理流量
负载均衡已将443的SSL流量转发到实例8788端口,无需单独配置6001端口的VirtualHost。将WebSocket代理规则整合到8788端口的配置中,让Apache统一处理HTTP和WebSocket请求:
<VirtualHost *:8788> ServerAdmin webmaster@localhost DocumentRoot /var/www/public/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/public/> Options All AllowOverride All order allow,deny allow from all </Directory> # 添加WebSocket代理规则 ProxyPass /app ws://127.0.0.1:6001/app ProxyPassReverse /app ws://127.0.0.1:6001/app ErrorLog /var/log/apache2/error.log LogLevel warn </VirtualHost>
- 明确Soketi监听配置
在soketi-config.json中添加监听参数,确保服务仅在本地6001端口运行,避免对外暴露:
{ "debug": true, "host": "127.0.0.1", "port": 6001, "appManager.array.apps": [ { "id": "blah", "key": "blah", "secret": "blah" } ] }
更新前端连接地址
将原连接地址wss://mydomain.com/6001/app/blahblah改为wss://mydomain.com/app/blahblah——负载均衡会把443流量转至实例8788,Apache再将/app路径代理到本地soketi服务。重启Apache生效配置
执行命令重启服务:
sudo systemctl restart apache2
- 检查负载均衡WebSocket支持
确认AWS负载均衡的443监听规则已开启WebSocket支持,目标组需允许HTTP升级头的转发,确保WebSocket握手请求能正常传递到后端实例。
验证
在浏览器控制台执行以下代码测试连接:
const socket = new WebSocket('wss://mydomain.com/app/blahblah'); socket.onopen = () => console.log('连接成功'); socket.onerror = (err) => console.error('连接失败', err);
内容的提问来源于stack exchange,提问作者user3389171
相关产品推荐
相关产品推荐

