WebSocket无法连接EMQX服务器问题排查及替代方案咨询
问题
在AWS EC2实例上通过Docker运行Caddy和EMQX,用Caddy做反向代理,当前可通过emqx.domain.com访问EMQX控制台,但在Diagnose板块连接WebSocket客户端时失败,报错:
WebSocket connection to 'wss://emqx.domain.com:8084/mqtt' failed
不同场景测试结果:
禁用Caddy代理时
- 仅开放EC2安全组18083端口:可通过服务器IP
78.34.23.434访问EMQX控制台 - 开放18083、8083端口:可访问控制台,WebSocket客户端能通过WebSocket协议连接
- 开放18083、8083、8084端口:可访问控制台,WebSocket协议可连接,但WebSocket-Secure协议无法连接
启用Caddy代理时
- 开放18083、8083、8084端口:可访问控制台,但WebSocket及WebSocket-Secure协议均无法连接
相关配置文件
Caddyfile
emqx.domain.com { reverse_proxy emqx:18083 } was://emqx.domain.com:8084/mqtt { reverse_proxy emqx:8084 }
docker-compose-caddy.yml
version: '3' services: caddy: image: caddy:2.2.1-alpine container_name: caddy restart: always ports: - "80:80" - "443:443" volumes: - ./site:/srv - ./caddy_config:/config - ./caddy_data:/data - ./Caddyfile:/etc/caddy/Caddyfile
docker-compose-emqx.yml
version: '3' services: emqx: image: emqx/emqx container_name: emqx restart: always volumes: - ./data:/opt/emqx/data - ./log:/opt/emqx/log environment: - EMQX_NAME=emqx - EMQX_LISTENER__TCP__EXTERNAL=1883 - EMQX_LOADED_PLUGINS="emqx_management,emqx_dashboard,emqx_bridge_mqtt,emqx_sn" - EMQX_LISTENER__TCP__EXTERNAL=8883 # Add another listener for SSL/TLS - EMQX_LISTENER__WEBSOCKET__EXTERNAL=8083 # Add a WebSocket listener - EMQX_LISTENER__WEBSOCKET_SECURE__EXTERNAL=8084 ports: - 1883:1883 #TCP - 8083:8083 #WEBSOCKET - 8084:8084 #WEBSOCKET_SECURE - 8883:8883 #SSL/TSL - 18083:18083 #DASHBOARD
解决方案
1. 修正Caddy配置错误
你的Caddyfile存在两处关键问题:
was://是无效协议,需统一通过HTTPS站点配置处理WSS请求- Caddy容器仅映射了80和443端口,直接指定8084端口的配置无法生效
修改后的Caddyfile,将WebSocket和WSS请求都通过443端口反向代理:
emqx.domain.com { # 处理控制台请求 reverse_proxy emqx:18083 # 匹配WebSocket请求并转发 @ws { path /mqtt header Upgrade websocket header Connection *Upgrade* } reverse_proxy @ws emqx:8083 # 匹配WebSocket-Secure请求并转发 @wss { path /mqtt header Upgrade websocket header Connection *Upgrade* } reverse_proxy @wss emqx:8084 }
2. 调整EMQX环境变量配置
你的EMQX环境变量重复定义了EMQX_LISTENER__TCP__EXTERNAL,会覆盖1883端口的配置,同时WSS需要SSL证书支持,修正后配置如下:
environment: - EMQX_NAME=emqx - EMQX_LISTENER__TCP__EXTERNAL=1883 - EMQX_LISTENER__TCP__SSL__EXTERNAL=8883 # 正确定义SSL/TLS TCP端口 - EMQX_LISTENER__WEBSOCKET__EXTERNAL=8083 - EMQX_LISTENER__WEBSOCKET_SECURE__EXTERNAL=8084 - EMQX_LISTENER__WEBSOCKET_SECURE__EXTERNAL__SSL__CERTFILE=/opt/emqx/etc/certs/emqx.crt - EMQX_LISTENER__WEBSOCKET_SECURE__EXTERNAL__SSL__KEYFILE=/opt/emqx/etc/certs/emqx.key - EMQX_LOADED_PLUGINS="emqx_management,emqx_dashboard,emqx_bridge_mqtt,emqx_sn"
注:EMQX默认会生成自签名证书,但浏览器会提示不安全,建议复用Caddy自动申请的Let's Encrypt证书,将证书文件挂载到EMQX容器对应目录。
3. 容器网络与安全组调整
- 确保Caddy和EMQX处于同一个Docker网络:可将两个docker-compose文件合并,或手动创建网络并将两个容器加入
- EC2安全组只需开放80和443端口,无需开放8083、8084,所有请求通过Caddy的443端口转发
- 测试时使用
wss://emqx.domain.com/mqtt作为连接地址,不要添加8084端口
4. 测试验证
修改配置后重启容器:
docker-compose -f docker-compose-caddy.yml restart docker-compose -f docker-compose-emqx.yml restart
在EMQX控制台Diagnose板块,用wss://emqx.domain.com/mqtt测试WebSocket连接。
免费开源EMQX替代方案
- Mosquitto:轻量级MQTT broker,资源占用低,适配小型项目与边缘设备,支持MQTT 3.1/3.1.1/5.0协议
- VerneMQ:分布式MQTT broker,支持水平扩展与高可用性,适合大规模物联网场景
- HiveMQ Community Edition:HiveMQ的开源版本,支持MQTT 5.0,提供丰富扩展接口,适配企业级项目
- Eclipse Mosquitto:Eclipse生态核心项目,配套Paho客户端库,生态完善,适合基于Eclipse体系的开发
内容的提问来源于stack exchange,提问作者PARANJAY
相关产品推荐
相关产品推荐

