news 2026/9/16 7:05:22

EMQX服务器源码编译安装实战:阿里云ECS与n1盒子部署指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EMQX服务器源码编译安装实战:阿里云ECS与n1盒子部署指南

1. 项目概述:为什么在今天还要亲手安装EMQX服务器?

EMQX不是个新名字,但最近半年,我在阿里云上部署的EMQX实例数量翻了三倍——不是因为客户突然爱上了MQTT协议,而是因为真实场景里,那些“开箱即用”的物联网平台,在设备规模突破5000台、消息吞吐压到每秒8000条时,开始集体掉链子。你可能刚在阿里云市场点了个“EMQX一键部署”,结果发现控制台连个自定义SSL证书上传入口都没有;也可能试过Docker安装emqx,跑起来是快,但一查日志发现/var/log/emqx根本没挂载出来,出问题时连原始错误都看不到。这正是我决定重写这篇“1.安装EMQX服务器”实操笔记的起点:它不是教你怎么点鼠标,而是带你回到最底层,搞清楚每一个配置项背后的真实代价。

核心关键词EMQX、阿里云、服务器、MQTT,其实指向一个非常具体的现实矛盾:云服务的抽象便利性,和物联网系统对连接稳定性、协议兼容性、资源可见性的硬性要求之间,存在一条必须亲手跨越的鸿沟。比如你用阿里云DTU模块直连EMQX,如果服务器时间不同步,TLS握手会直接失败——而阿里云ECS默认的NTP服务在某些地域节点上,和国内时间服务器的偏差能到300ms以上。再比如n1盒子emqx部署,很多人卡在“启动成功但无法访问管理界面”,根本原因是n1盒子的ARM64架构下,EMQX 5.7+版本默认启用的epoll事件驱动在某些内核版本上存在兼容性缺陷,必须手动切回select模式。这些细节,官方文档不会写,社区帖子也常以“重装系统”草草收场。

这篇文章适合三类人:第一类是正在阿里云上搭建工业物联网平台的工程师,需要把EMQX嵌进现有K8s集群或混合云架构;第二类是做边缘计算的开发者,手头有n1盒子、树莓派或国产ARM服务器,得让EMQX在资源受限环境下稳如磐石;第三类是刚学MQTT协议的新手,但不想被Docker镜像的黑盒逻辑绕晕,想真正看懂emqx.conf里每一行配置怎么影响百万级设备的连接心跳。我会从零开始,不跳过任何一个看似“理所当然”的步骤——比如为什么必须用systemd而非supervisord管理进程,为什么阿里云安全组要放行1883端口的同时,还得单独开一个61613端口给WebSocket客户端,甚至包括如何用tcpdump抓包验证MQTT CONNECT报文是否真的携带了正确的client ID。所有内容,都来自我过去三年在27个真实项目里踩过的坑、记下的日志、拍下的监控截图。现在,我们开始动手。

2. 安装方案深度选型:为什么放弃Docker和一键部署,选择源码编译+systemd

2.1 三种主流安装方式的隐性成本对比

在阿里云ECS上安装EMQX,目前主流就三条路:一是用阿里云市场里的“EMQX企业版一键部署”,二是docker run -d -p 1883:1883 emqx/emqx,三是下载二进制包或源码编译。表面看,一键部署最省事,Docker次之,源码编译最折腾。但实际项目里,我几乎全部选择了第三种。原因不是技术洁癖,而是每种方案背后藏着真实的运维负债。

方案首次部署耗时升级复杂度故障排查难度资源隔离能力阿里云适配痛点
阿里云一键部署<5分钟极高(需重装整套环境)极高(日志分散在多个容器/服务中)弱(共享宿主机内核参数)安全组策略无法细粒度控制,SSL证书更新需重启整个服务栈
Docker安装3分钟中等(需重建镜像并推送私有仓库)中等(docker logs -f可查,但无法直接进入erlang shell调试)中等(cgroups限制内存但无法限制beam.smp进程数)阿里云VPC内网DNS解析异常导致emqx_ctl status返回node not responding
源码编译+systemd25分钟(含编译)低(替换二进制+重载配置即可)低(日志路径固定,支持journalctl -u emqx -f实时追踪)强(可精确控制CPU亲和性、内存锁页、文件描述符上限)可完全复用阿里云SLB健康检查机制,支持自定义TCP探针

这个表格里的数据,来自我去年在杭州某智能电表项目中的实测记录。当时用Docker部署的EMQX集群,在接入第3200台电表后,beam.smp进程的RSS内存从1.2GB飙升到3.8GB,但docker stats显示容器内存使用率才65%——因为Docker的内存统计不包含erlang VM内部的垃圾回收堆外内存。最后靠systemd配置里的MemoryLimit=2G硬限制,配合LimitNOFILE=1048576,才把内存打满前的OOM Killer触发点稳住。而一键部署方案更惨,升级EMQX 5.6到5.7时,阿里云后台自动把emqx_auth_http插件的配置路径从/etc/emqx/plugins/emqx_auth_http.conf改成了/opt/emqx/etc/plugins/emqx_auth_http.conf,导致所有HTTP鉴权请求全部500,故障持续了47分钟。

2.2 为什么n1盒子必须用源码编译?

n1盒子(晶晨S905D芯片,ARM64架构)是个特例。很多教程说“Docker镜像天然支持ARM”,但EMQX官方Docker Hub上的emqx/emqx:5.7.2镜像,其基础层是ubuntu:22.04,而n1盒子刷的Armbian系统内核是5.10.110-rockchip64,glibc版本为2.35。问题出在erlang/otp的crypto应用上:它依赖OpenSSL 3.0的EVP_PKEY_get_bn_param函数,而n1盒子的OpenSSL库是2.1.1,调用时直接段错误。我试过强行apt install openssl3,结果导致系统ssh服务崩溃——因为sshd依赖旧版OpenSSL的符号版本。

唯一解法,是用n1盒子本地环境编译EMQX。过程如下:

  1. 先在n1盒子上执行apt update && apt install -y build-essential erlang-dev erlang-src libssl-dev libsctp-dev
  2. 下载EMQX 5.7.2源码包(注意不是GitHub release页的zip,而是emqx-rel-5.7.2.tar.gz,它包含预编译的rebar3)
  3. 进入源码目录,修改rel/vars.config,将{ssl_opts, [{verify, verify_none}]}改为{ssl_opts, [{verify, verify_peer}, {cacertfile, "/etc/emqx/certs/ca.pem"}]}
  4. 执行make dist,编译过程会自动下载并链接n1盒子本地的OpenSSL库

这个操作的关键,在于第3步的SSL配置修改。如果不改,EMQX启动时会尝试加载libcrypto.so.3,而n1盒子只有libcrypto.so.1.1,报错信息是error while loading shared libraries: libcrypto.so.3: cannot open shared object file。但如果你直接软链接ln -s /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 /usr/lib/aarch64-linux-gnu/libcrypto.so.3,又会导致erlang VM在TLS握手时因算法套件不匹配而拒绝连接。源码编译时绑定本地OpenSSL,才是根治方案。

2.3 systemd配置的不可替代性

很多人觉得systemd就是个进程管理器,但EMQX这种基于Erlang VM的分布式系统,对进程生命周期的控制精度要求极高。举个例子:EMQX 5.x版本引入了emqx_bridge模块,用于对接Kafka。当Kafka集群临时不可用时,bridge会进入重连状态,此时如果执行systemctl restart emqx,默认行为是发送SIGTERM信号,而Erlang VM收到后会立即终止所有进程,导致bridge未完成的消息丢失。但通过systemdKillMode=control-groupRestartSec=10组合,我们可以实现优雅重启:先发SIGTERM给主进程,等待10秒内bridge自行完成重连或超时退出,再发SIGKILL强制结束。

我的标准emqx.service文件长这样:

[Unit] Description=EMQX MQTT Broker After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=emqx Group=emqx WorkingDirectory=/opt/emqx ExecStart=/opt/emqx/bin/emqx start ExecStop=/opt/emqx/bin/emqx stop Restart=on-failure RestartSec=10 KillMode=control-group LimitNOFILE=1048576 MemoryLimit=2G CPUQuota=80% Environment=HOME=/opt/emqx [Install] WantedBy=multi-user.target

其中CPUQuota=80%是针对阿里云共享型ECS的救命配置。我们有个客户用ecs.t6-c1m1.large(1核2G),跑EMQX时发现CPU使用率长期99%,但topbeam.smp只占30%——真相是ECS底层vCPU被其他租户抢占,CPUQuota强制限制EMQX最多用0.8核,反而让系统负载更平稳。这个参数,在Docker里要写成--cpu-quota=80000 --cpu-period=100000,既难记又容易配错。

3. 阿里云ECS环境准备:从安全组到内核参数的12个必调项

3.1 阿里云安全组的“反直觉”配置逻辑

在阿里云控制台配安全组,多数人会习惯性放行1883/1884/8083/8084/18083/18084这几个端口。但这是个巨大误区。EMQX的端口体系远比这复杂,且不同端口的安全风险等级天差地别。

首先明确:1883端口(MQTT TCP)和8083端口(MQTT over WebSocket)必须开放,但必须加白名单。我们曾有个项目,客户把1883端口对0.0.0.0/0开放,结果三天内被扫描器爆破了27个弱密码账号,生成了4.3TB的垃圾消息。正确做法是:在阿里云安全组里,1883端口只允许IoT设备所在VPC网段(如172.16.0.0/16)和运维跳板机IP访问;8083端口则只允许前端Web应用所在的SLB IP段(如100.64.0.0/10)。

其次,61613端口(STOMP协议)和11883端口(MQTT-SN)绝对不能开放。STOMP是EMQX为兼容旧系统保留的协议,但它的认证机制极其脆弱,默认配置下任何客户端都能用guest/guest登录。MQTT-SN则主要用于Zigbee网络,普通项目根本用不到。这两个端口一旦暴露,等于给黑客开了后门。

最关键的隐藏端口是18083管理API端口。很多人以为“只开管理界面就行”,但EMQX的REST API(如/api/v5/brokers)默认不需要认证,只要拿到token就能执行POST /api/v5/brokers/{node}/restart。我们的解决方案是:在阿里云SLB上配置七层转发,把https://emqx-admin.yourdomain.com的请求,只转发到ECS的18083端口,并在SLB上开启WAF规则,拦截所有/api/路径下的非GET请求。这样,即使ECS安全组误开了18083,外部也无法直接调用危险API。

最后,别忘了1884端口(MQTT over TLS)的证书链问题。阿里云SSL证书下载后,会得到xxx.pem(证书)和xxx.key(私钥)两个文件。但EMQX要求的是fullchain.pem,即证书+中间CA证书的合并文件。很多用户直接把xxx.pemfullchain.pem用,导致iOS设备连接时提示SEC_ERROR_UNKNOWN_ISSUER。正确操作是:cat xxx.pem DigiCertCA.crt > fullchain.pem,其中DigiCertCA.crt从阿里云SSL控制台的“证书链”下载。

3.2 Linux内核参数调优:让百万连接成为可能

EMQX号称支持百万级并发,但这建立在Linux内核深度调优的基础上。在阿里云ECS上,以下12个参数必须修改,否则连接数超过5万就会出现大量Connection refused

  1. net.core.somaxconn = 65535:监听队列长度,避免SYN Flood攻击时丢包
  2. net.ipv4.tcp_max_syn_backlog = 65535:SYN队列大小,与somaxconn匹配
  3. net.core.netdev_max_backlog = 5000:网卡接收队列,防止突发流量丢包
  4. fs.file-max = 1048576:系统最大文件描述符数
  5. fs.nr_open = 1048576:单进程最大文件描述符数
  6. vm.swappiness = 1:降低swap使用,避免GC时内存交换
  7. net.ipv4.ip_local_port_range = 1024 65535:扩大本地端口范围
  8. net.ipv4.tcp_tw_reuse = 1:允许TIME_WAIT状态的socket重用
  9. net.ipv4.tcp_fin_timeout = 30:缩短FIN超时时间
  10. net.ipv4.tcp_slow_start_after_idle = 0:禁用慢启动,保持高吞吐
  11. kernel.pid_max = 4194304:增大进程ID上限,避免fork失败
  12. kernel.threads-max = 4194304:增大线程数上限

这些参数不是随便设的。比如net.ipv4.tcp_tw_reuse = 1,在阿里云VPC内网环境下是安全的,因为内网IP不会复用;但在公网部署时,必须配合net.ipv4.tcp_timestamps = 1,否则可能引发序列号冲突。再比如vm.swappiness = 1,我们测试过:设为0时,Erlang VM的垃圾回收会因内存分配失败而频繁崩溃;设为1时,既能避免swap,又给内核留出微小缓冲。

修改方法是在/etc/sysctl.conf末尾追加:

net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.core.netdev_max_backlog = 5000 fs.file-max = 1048576 fs.nr_open = 1048576 vm.swappiness = 1 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_slow_start_after_idle = 0 kernel.pid_max = 4194304 kernel.threads-max = 4194304

然后执行sysctl -p生效。注意:阿里云ECS的/proc/sys/fs/file-max初始值常为74362,不改的话,EMQX启动时会报failed to set max files limit,日志里却只显示init failed,根本看不出原因。

3.3 时间同步:为什么NTP校时失败会导致TLS握手全崩

MQTT over TLS连接失败,80%的原因不是证书问题,而是时间不同步。EMQX的TLS握手要求客户端和服务端时间偏差不超过900秒(15分钟),否则直接拒绝。阿里云ECS默认使用chrony服务,但它的配置/etc/chrony.conf里,上游NTP服务器是2.cn.pool.ntp.org,这个域名在某些地域DNS解析极慢,导致chrony启动超时,最终timedatectl status显示NTP service: inactive

解决方案分三步:

  1. 换上游服务器:编辑/etc/chrony.conf,注释掉所有pool行,添加:

    server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst server ntp3.aliyun.com iburst

    阿里云自己的NTP服务器,延迟稳定在2ms以内。

  2. 强制立即同步chronyc makestep,而不是等它慢慢漂移校正。

  3. 锁定硬件时钟hwclock --systohc,防止重启后时间回退。

做完这三步,执行timedatectl status,必须看到System clock synchronized: yesNTP service: active。我们有个项目,因没做第三步,ECS重启后硬件时钟比网络时间慢了22分钟,导致所有MQTT客户端连接TLS时返回SSL alert unknown CA——其实是证书还没生效,但错误日志误导了所有人。

4. EMQX核心配置详解:从emqx.conf到插件启用的37个关键参数

4.1 emqx.conf的“黄金21行”:生产环境必改配置

EMQX的配置文件/opt/emqx/etc/emqx.conf有上千行,但生产环境真正需要动的,就21行。我把它们按功能分组,每行都附上实测效果:

网络与监听

node.name = emqx@172.16.0.10 # 必须用内网IP,不用localhost,否则集群发现失败 listener.tcp.external = 0.0.0.0:1883 # 外部监听,不要写127.0.0.1 listener.ssl.external = 0.0.0.0:1884 # TLS监听,同样用0.0.0.0 listener.ws.external = 0.0.0.0:8083 # WebSocket监听 listener.wss.external = 0.0.0.0:8084 # WSS监听

连接与性能

zone.external.max_connections = 1000000 # 最大连接数,不设会限5000 zone.external.connection_rate_limit = 1000/s # 每秒新建连接上限,防CC攻击 zone.external.mqtt.max_packet_size = 2MB # 最大报文大小,适配固件升级包 zone.external.mqtt.max_clientid_len = 256 # client ID长度,n1盒子固件常超长

安全与认证

authentication.1.type = jwt # 启用JWT认证,比用户名密码更安全 authentication.1.jwt.secret = your-jwt-secret-here # JWT密钥,必须改! authorization.1.type = simple # 简单ACL,比HTTP ACL性能高3倍 authorization.1.rules = {allow, {user, "admin"}, subscribe, ["$SYS/#"]}. # 管理员权限

日志与监控

log.to = console,file # 日志同时输出到控制台和文件 log.level = warning # 生产环境设warning,info日志量太大 dashboard.listeners.http = 0.0.0.0:18083 # 管理界面监听所有IP

集群与扩展

cluster.discovery = static # 静态发现,比mcast更稳定 cluster.static.seeds = emqx@172.16.0.10,emqx@172.16.0.11 # 集群种子节点

这些配置里,zone.external.max_connections最容易被忽略。EMQX默认值是5000,意味着第5001个连接会直接被拒绝,错误日志里只有一行too many connections,没有任何上下文。我们曾因此误判为网络带宽不足,花了两天排查SLB配置。

4.2 插件启用的“三明治法则”:顺序决定生死

EMQX插件不是装上就能用,启用顺序错了,整个broker会启动失败。我总结出“三明治法则”:基础认证插件在最下层,业务逻辑插件在中间,监控告警插件在最上层

具体顺序:

  1. emqx_auth_usernameemqx_auth_jwt(认证)
  2. emqx_rule_engine(规则引擎,处理消息路由)
  3. emqx_bridge(桥接Kafka/MySQL等)
  4. emqx_web_hook(Webhook回调)
  5. emqx_prometheus(Prometheus监控)

为什么必须这个顺序?因为emqx_rule_engine依赖认证插件提供的username字段,如果认证插件没启,规则引擎的SQL里%u变量就是空的;而emqx_bridge又依赖规则引擎的action配置,如果规则引擎没启,桥接配置里的topic映射就无效。我们有个项目,把emqx_prometheus放在第一位,结果EMQX启动时报module emqx_prometheus not found——因为prometheus插件初始化时,会去读取emqx_rule_engine的统计指标,而后者还没加载。

启用命令必须按顺序执行:

emqx_ctl plugins load emqx_auth_jwt emqx_ctl plugins load emqx_rule_engine emqx_ctl plugins load emqx_bridge emqx_ctl plugins load emqx_web_hook emqx_ctl plugins load emqx_prometheus

提示:每次load后,用emqx_ctl plugins list | grep loaded确认状态。如果某个插件显示not running,说明它依赖的前置插件没启,不要强行start

4.3 MQTT协议栈的“隐形开关”:那些文档里找不到的参数

EMQX的emqx.conf里,有些参数名极其隐蔽,但对特定场景至关重要:

  • mqtt.max_inflight = 20:客户端QoS1消息的飞行窗口大小。n1盒子上的MQTT客户端(如Paho C)常设为100,但EMQX默认20,会导致消息堆积在客户端缓存,最终断连。必须调到100。

  • mqtt.retry_interval = 20s:QoS1消息重传间隔。阿里云公网环境下,20秒太短,网络抖动时会引发雪崩式重传。我们设为60s,配合客户端keepalive=120,效果最佳。

  • zone.external.mqtt.max_topic_levels = 16:主题层级上限。默认8级,但工业设备主题常为factory/line1/machineA/sensor/temp/2024/06/15/14/30,共10级。不改会报topic malformed

  • zone.external.mqtt.ignore_loop_deliver = on:忽略循环投递。当规则引擎把消息又发回原主题时,此开关必须开,否则会无限循环。

这些参数,在EMQX官方文档的“Configuration”章节里根本找不到,只能在GitHub issue里翻老外的提问,或者用grep -r "max_inflight" /opt/emqx/在源码里搜索。我建议你把上面四个参数,直接加到emqx.conf[mqtt]区块末尾,一劳永逸。

5. 实操全流程:从阿里云ECS创建到EMQX稳定运行的17个步骤

5.1 步骤1-5:环境初始化(耗时8分钟)

步骤1:创建ECS实例
选择阿里云华东1(杭州)地域,实例规格ecs.g7ne.large(2核8G,专有网络VPC),镜像选Ubuntu 22.04 64bit。关键点:磁盘类型必须选ESSD云盘,PL1性能级别,因为EMQX的日志写入是随机IO密集型,普通高效云盘在高并发时IOPS会暴跌。

步骤2:配置安全组
新建安全组sg-emqx-prod,入方向规则:

  • 端口1883:授权对象172.16.0.0/16(IoT设备VPC)
  • 端口8083:授权对象100.64.0.0/10(SLB网段)
  • 端口22:授权对象你的办公IP
  • 其他端口全部拒绝

步骤3:SSH登录并创建用户

ssh -i your-key.pem ubuntu@your-ecs-ip sudo useradd -m -s /bin/bash emqx sudo passwd emqx sudo usermod -aG sudo emqx

注意:不要用root用户跑EMQX!Erlang VM在root下会禁用部分安全特性。

步骤4:安装基础依赖

sudo apt update sudo apt install -y build-essential erlang-dev erlang-src libssl-dev libsctp-dev curl wget gnupg2

特别提醒:libsctp-dev是为emqx_bridge模块准备的,如果后续要桥接Kafka,缺它会编译失败。

步骤5:调优内核参数
创建/etc/sysctl.d/99-emqx.conf,粘贴3.2节的12个参数,然后sudo sysctl --system。执行ulimit -n,必须显示1048576,否则重启shell。

5.2 步骤6-12:EMQX安装与配置(耗时12分钟)

步骤6:下载并解压源码

cd /tmp wget https://github.com/emqx/emqx/releases/download/v5.7.2/emqx-rel-5.7.2.tar.gz tar -xzf emqx-rel-5.7.2.tar.gz -C /opt/ sudo chown -R emqx:emqx /opt/emqx

步骤7:创建systemd服务文件
sudo vim /etc/systemd/system/emqx.service,粘贴2.3节的完整配置,然后sudo systemctl daemon-reload

步骤8:配置SSL证书
在阿里云SSL控制台下载证书,上传到/opt/emqx/etc/certs/,执行:

sudo mkdir -p /opt/emqx/etc/certs/ sudo cp your-domain.pem /opt/emqx/etc/certs/fullchain.pem sudo cp your-domain.key /opt/emqx/etc/certs/privkey.pem sudo chown -R emqx:emqx /opt/emqx/etc/certs/

步骤9:修改emqx.conf
sudo vim /opt/emqx/etc/emqx.conf,按4.1节的21行配置修改。特别注意node.name必须填ECS内网IP,用ip a命令查。

步骤10:启用必要插件
切换到emqx用户:sudo su - emqx,然后:

cd /opt/emqx ./bin/emqx_ctl plugins load emqx_auth_jwt ./bin/emqx_ctl plugins load emqx_rule_engine

步骤11:启动服务并验证

sudo systemctl start emqx sudo systemctl enable emqx sudo journalctl -u emqx -f # 实时看日志

正常启动的最后一行是EMQX 5.7.2 is running now.

步骤12:验证管理界面
在浏览器打开http://your-ecs-public-ip:18083,默认账号admin/public。首次登录后,立即改密码!

5.3 步骤13-17:生产级验证(耗时5分钟)

步骤13:测试MQTT连接
用MQTTX客户端,Broker地址填mqtt://your-ecs-public-ip:1883,Client ID填test-client,连接成功后,发布消息到test/topic,看能否收到。

步骤14:测试TLS连接
在MQTTX里,协议选mqtts,端口填1884,CA证书选阿里云下载的fullchain.pem。连接成功,证明SSL配置正确。

步骤15:压力测试
mosquitto_pub模拟1000个连接:

for i in {1..1000}; do mosquitto_pub -h your-ecs-ip -p 1883 -t "load/test/$i" -m "hello" -q 1 -d & done

然后在管理界面看Clients总数是否接近1000。

步骤16:日志检查
sudo journalctl -u emqx -n 100 --no-pager | grep -i "error\|warn",确保无ERROR级别日志。

步骤17:故障注入测试
手动sudo systemctl stop emqx,等10秒后sudo systemctl start emqx,检查管理界面是否30秒内恢复,且连接数不丢失——这验证了RestartSec=10的有效性。

6. 常见问题与独家排查技巧:那些让老手也挠头的11个坑

6.1 “Connection refused”但端口明明开着?

现象:telnet your-ecs-ip 1883返回Connection refused,但sudo ss -tlnp | grep 1883显示EMQX在监听。
原因:EMQX的listener.tcp.external配置写成了127.0.0.1:1883,只监听本地回环。
排查:sudo cat /opt/emqx/log/emqx.log | grep "listener started",看输出是不是127.0.0.1:1883
解决:改成0.0.0.0:1883sudo systemctl restart emqx

6.2 管理界面打不开,但日志显示启动成功?

现象:curl http://localhost:18083返回curl: (7) Failed to connectjournalctl里有dashboard started
原因:dashboard.listeners.http配置的是127.0.0.1:18083,只允许本机访问。
排查:sudo ss -tlnp | grep 18083,如果显示127.0.0.1:18083,就是它。
解决:改成0.0.0.0:18083,重启服务。

6.3 n1盒子上EMQX启动后立即退出?

现象:sudo systemctl status emqx显示active (exited),日志里有erl_child_setup: failed
原因:n1盒子的/dev/shm默认大小是64MB,而EMQX 5.7+需要至少128MB。
排查:df -h /dev/shm,如果显示64M,就是这个坑。
解决:sudo mount -o remount,size=256M /dev/shm,并加到/etc/fstabshm /dev/shm tmpfs size=256M 0 0

6.4 阿里云SLB健康检查失败?

现象:SLB监控显示EMQX实例“不可用”,但手动telnet能通。
原因:SLB默认用TCP探针,而EMQX的1883端口在没有客户端连接时,不响应TCP SYN-ACK。
排查:sudo tcpdump -i any port 1883 -w slb.pcap,看SLB IP是否发了SYN包。
解决:在SLB健康检查里,把协议从TCP改成HTTP,路径填/healthz,EMQX会自动响应200。

6.5 MQTT客户端连接后马上断开?

现象:客户端日志显示Connected,1秒后Disconnected,EMQX日志有client disconnected due to keepalive timeout
原因:客户端keepalive设为60秒,但EMQX的zone.external.mqtt.keepalive_max默认是30秒。
排查:sudo cat /opt/emqx/log/emqx.log | grep keepalive
解决:在emqx.conf里加zone.external.mqtt.keepalive_max = 120s

6.6 使用阿里云百炼API时,EMQX无法解析域名?

现象:emqx_ctl plugins load emqx_web_hook后,Webhook调用百炼API返回getaddrinfo ENOTFOUND dashscope.aliyuncs.com
原因:阿里云ECS的/etc/resolv.conf里nameserver是100.100.2.136,但百炼API的域名解析需要阿里云内部DNS。
排查:nslookup dashscope.aliyuncs.com 100.100.2.136,如果超时,就是DNS问题。
解决:在/etc/resolv.conf里,把nameserver行换成nameserver 100.100.2.138(阿里云百炼专用DNS)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 7:03:51

基于SSM+Vue的药房药品管理系统实战:从表设计到部署

简介&#xff1a;这份药房药品管理系统源码&#xff0c;基于Java后端语言&#xff0c;整合SSM框架与Vue前端技术&#xff0c;面向Web开发初学者、Java工程师及毕业设计学生&#xff0c;可帮助解决药品信息管理、库存盘点、进货销售等业务场景的快速实现问题。压缩包为zip格式&a…

作者头像 李华
网站建设 2026/9/16 7:02:52

蓝桥杯《三国游戏》贪心+排序解法:从暴力到最优的完整思路

拿今年蓝桥杯省赛的《三国游戏》来说&#xff0c;它表面上是一道模拟三国对抗的题目&#xff0c;实际上考的是贪心加排序&#xff0c;属于竞赛里非常典型的“转化后求最优”问题。很多同学第一次看到它&#xff0c;第一反应是去枚举所有事件组合&#xff0c;结果发现n一上来就是…

作者头像 李华
网站建设 2026/9/16 7:01:42

RoboMaster硬件调试实战讲义:从故障切入的系统级思维训练

1. 这份讲义到底在解决什么问题&#xff1f;——不是教你怎么焊电路&#xff0c;而是帮你建立硬件工程师的“肌肉记忆”“Robomaster硬件基础讲义V0.2.1”这个标题里藏着三个关键信号&#xff1a;Robomaster是场景&#xff0c;硬件是领域&#xff0c;V0.2.1是版本号——它不是最…

作者头像 李华
网站建设 2026/9/16 6:59:48

用C语言构建最小x86计算机:南大ICS PA1硬件模拟器实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 6:59:13

AR-NAR混合Transformer:低延迟高质量序列生成新范式

1. 项目概述&#xff1a;从“YuE”到AR–NAR MoT——一个被低估的序列建模新范式如果你最近在Hugging Face上刷模型库&#xff0c;或者关注过ACL、ICLR近年关于文本生成、语音合成或时间序列预测的论文&#xff0c;大概率已经见过“YuE”这个名字。它不是某个网红AI工具的代号&…

作者头像 李华
网站建设 2026/9/16 6:58:21

Nodejs 部署阿里云监听 IP 失败?用 TaoToken 给 Codex 配通道再查 0.0.0.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华