You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端口:可通过服务器IP78.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:55:55