EMQX5.0与MySQL认证集成实战:从Navicat配置到MQTTX测试全流程

发布时间:2026/6/7 7:01:13

EMQX5.0与MySQL认证集成实战:从Navicat配置到MQTTX测试全流程 1. 环境准备搭建MySQL与EMQX基础服务在开始EMQX5.0与MySQL认证集成之前我们需要先准备好基础运行环境。这里我选择在阿里云ECS服务器上部署服务操作系统为Ubuntu 20.04 LTS。之所以选择云服务器是因为它更接近真实生产环境而且配置过程与本地开发机基本一致。首先安装Docker环境这是当前最便捷的部署方式。执行以下命令安装Docker引擎sudo apt update sudo apt install -y docker.io sudo systemctl enable docker sudo systemctl start docker接下来拉取MySQL5.7官方镜像这个版本在企业环境中使用广泛稳定性有保障docker pull mysql:5.7启动MySQL容器时需要特别注意端口映射和初始密码设置。我建议使用以下命令启动容器docker run --name emqx_mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyour_secure_password \ -e MYSQL_DATABASEemqx_auth \ -e MYSQL_USERemqx \ -e MYSQL_PASSWORDemqx_password \ -d mysql:5.7 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci这里有几个关键参数需要注意-p 3306:3306将容器端口映射到主机环境变量不仅设置了root密码还预先创建了emqx专用数据库和用户字符集设置为utf8mb4以支持完整Unicode字符验证MySQL是否正常运行docker logs emqx_mysql如果看到MySQL init process done. Ready for start up.的日志说明数据库已就绪。2. Navicat连接配置与数据库初始化现在我们需要用Navicat这个可视化工具连接到远程MySQL服务。首先确保云服务器的安全组已经放行3306端口这个步骤经常被初学者忽略导致连接失败。打开Navicat后点击左上角的连接按钮选择MySQL类型。在弹出窗口中需要填写以下关键信息连接名任意有意义的名称如Aliyun_MySQL主机填写云服务器的公网IP地址端口保持默认3306用户名root或其他有权限的用户密码启动容器时设置的密码测试连接时如果报错常见原因有服务器防火墙未放行3306端口MySQL用户权限未配置远程访问MySQL配置文件bind-address限制连接成功后我们需要创建EMQX认证所需的表结构。官方提供了标准SQL脚本但我在实际使用中发现需要做些调整。建议先创建一个专用数据库如果启动容器时没预先创建CREATE DATABASE emqx_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;然后执行以下脚本创建用户表和ACL表USE emqx_auth; -- 用户表 CREATE TABLE mqtt_user ( id int(11) unsigned NOT NULL AUTO_INCREMENT, username varchar(100) DEFAULT NULL, password varchar(100) DEFAULT NULL, salt varchar(35) DEFAULT NULL, is_superuser tinyint(1) DEFAULT 0, created datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY mqtt_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 访问控制表 CREATE TABLE mqtt_acl ( id int(11) unsigned NOT NULL AUTO_INCREMENT, allow int(1) DEFAULT NULL COMMENT 0: deny, 1: allow, ipaddr varchar(60) DEFAULT NULL COMMENT IpAddress, username varchar(100) DEFAULT NULL COMMENT Username, clientid varchar(100) DEFAULT NULL COMMENT ClientId, access int(2) NOT NULL COMMENT 1: subscribe, 2: publish, 3: pubsub, topic varchar(100) NOT NULL DEFAULT COMMENT Topic Filter, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;插入测试用户数据密码为明文publicINSERT INTO mqtt_user (username, password, is_superuser) VALUES (test, public, 0);3. EMQX5.0认证配置详解完成数据库准备后现在进入关键的EMQX配置环节。访问EMQX控制台默认端口18083使用admin/public初始凭证登录。在左侧菜单进入访问控制 → 认证页面点击创建按钮开始配置。认证方式选择Password-Based这是最常用的基于用户名密码的认证方式。数据源选择MySQL后需要填写以下连接信息服务器地址MySQL容器所在服务器的IP端口3306数据库名emqx_auth之前创建的用户名/密码MySQL的认证凭据加密方式选择plain测试用明文生产环境建议sha256等关键的SQL配置部分需要特别注意-- 认证查询SQL SELECT password FROM mqtt_user WHERE username ${username} LIMIT 1 -- 超级用户查询SQL SELECT is_superuser FROM mqtt_user WHERE username ${username} LIMIT 1 -- ACL查询SQL SELECT allow, ipaddr, username, clientid, access, topic FROM mqtt_acl WHERE username ${username} OR username $all这里有个常见坑点EMQX5.0默认期望密码字段名为password_hash而我们的表使用的是password。有两种解决方案修改SQL查询为SELECT password AS password_hash ...在EMQX配置中将密码哈希字段改为password我推荐第一种方式因为这样配置更清晰。完成所有配置后点击创建按钮如果状态显示为运行中说明认证服务已正常启动。4. MQTTX测试与故障排查最后我们使用MQTTX客户端验证整个认证流程。MQTTX是一款跨平台的MQTT客户端工具支持Windows、macOS和Linux。新建连接时需要配置以下参数名称任意有意义的名称客户端ID保持自动生成即可主机地址EMQX服务器IP注意是EMQX不是MySQL端口默认1883用户名/密码使用数据库中的test/public连接成功后我们可以进行以下验证订阅主题尝试订阅test/topic发布消息向同一主题发布测试消息查看EMQX控制台的客户端页面确认连接信息常见问题及解决方案连接被拒绝检查EMQX认证配置中的SQL语句是否正确认证失败确认数据库中的密码与认证方式匹配明文/加密ACL限制检查mqtt_acl表中是否有对应权限记录在EMQX控制台的监控页面可以查看认证成功/失败的统计信息这对调试非常有帮助。如果遇到问题建议按以下顺序排查确认MySQL连接正常通过Navicat验证检查EMQX日志/var/log/emqx验证SQL查询在Navicat中能否返回预期结果确认MQTTX的连接参数正确5. 生产环境优化建议经过基础测试后如果要部署到生产环境还需要考虑以下优化措施数据库层面为mqtt_user表的username字段添加索引考虑使用连接池减少数据库压力定期清理非活跃用户安全加固不要使用明文密码推荐SHA256加盐加密限制超级用户数量配置适当的ACL规则启用TLS加密通信性能调优调整EMQX的MySQL连接池参数考虑使用Redis缓存热点数据监控数据库查询性能对于高并发场景建议在EMQX配置中增加以下参数authentication.mysql.pool_size 8 authentication.mysql.query_timeout 5s最后提醒一点EMQX5.0的Dashboard提供了完整的REST API所有配置都可以通过API管理这为自动化运维提供了很大便利。

相关新闻