使用Docker镜像方式安装
下载Docker镜像
通过docker方式下载:
docker pull emqx/emqx:v3.1.0
通过官网下载:
wget -O emqx-docker.zip https://www.emqx.io/downloads/v3/latest/emqx-docker.zip
unzip emqx-docker.zip
docker load < emqx-docker-v3.1.0
启动容器
docker run -d --name emqx31 -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v3.1.0
配置EMQ(对于v3.1.0)
#进入容器
docker exec -ti emqx31 /bin/sh
#MySQL认证
#1.首先先关闭匿名认证(默认是开启的谁都能够登录)
vi /opt/
## Value: true | false
allow_anonymous = false
#2.用户和权限的mysql表
CREATE TABLE mqtt_user (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
username varchar(100) DEFAULT NULL,
password varchar(100) DEFAULT NULL,
salt varchar(20) DEFAULT NULL,
is_superuser tinyint(1) DEFAULT 0,
created datetime DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY mqtt_username (username)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#3.插入cal规则
INSERT INTO `mqtt_acl` (`id`, `allow`, `ipaddr`, `username`, `clientid`, `access`, `topic`) VALUES
(1,1,NULL,'$all',NULL,2,'#'),
(2,0,NULL,'$all',NULL,1,'$SYS/#'),
(3,0,NULL,'$all',NULL,1,'eq #'),
(5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'),
(6,1,'127.0.0.1',NULL,NULL,2,'#'),
(7,1,NULL,'dashboard',NULL,1,'$SYS/#');
#4.插入用户(sha256值请自行转换)
insert into mqtt_user (`username`, `password`) values ('admin', '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4');
可以配置超级管理员(超级管理员会无视ACL规则对所有的topic都有订阅和推送的权限)
update mqtt_user set is_superuser=1 where id=x;
ps:注意 auth.mysql.password_hash 为sha256的话,新增用户时需要手动传递加密后的值,plain的话则无需加密,明码存放
#5.修改emqx mysql配置文件
vi /opt/emqx/etc/plugins/emqx_auth_mysql.conf
auth.mysql.server = xxxxxxxxx:3306
auth.mysql.username = root
auth.mysql.password = xxxxxxxx
auth.mysql.database = emq
#6.重启emqx
/opt/emqx/bin emqx stop
/opt/emqx/bin emqx start
/opt/emqx/bin emqx_ctl plugins load emqx_auth_mysql #开启mysql认证插件
mysql> select * from mqtt_acl;
+----+-------+-----------+-----------+----------+--------+--------+
| id | allow | ipaddr | username | clientid | access | topic |
+----+-------+-----------+-----------+----------+--------+--------+
| 1 | 1 | NULL | $all | NULL | 2 | # |
| 2 | 0 | NULL | $all | NULL | 1 | $SYS/# |
| 3 | 0 | NULL | $all | NULL | 1 | eq # |
| 4 | 1 | 127.0.0.1 | NULL | NULL | 2 | $SYS/# |
| 5 | 1 | 127.0.0.1 | NULL | NULL | 2 | # |
| 6 | 1 | NULL | dashboard | NULL | 1 | $SYS/# |
+----+-------+-----------+-----------+----------+--------+--------+
6 rows in set (0.00 sec)
allow - 1: allow; 0: deny
access - 1: subscribe; 2: publish; 3: publish and subscribe
以上规则分别表示:
允许任何用户发布除以 '$' 字符开头以外的任何主题的消息
拒绝任何用户订阅任何以 "$SYS/" 开头的主题
拒绝任何用户订阅 "#" 主题
允许本机用户发布任何以 "$SYS/" 开头的主题
允许本机用户发布发布除以 '$' 字符开头以外的任何主题的消息
允许 dashboard 用户订阅任何以 "$SYS/" 开头的主题
除此之外,用户可以导入自定义的 ACL 规则。