使用Docker镜像搭建EMQ服务器搭建

使用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 规则。
发布了13 篇原创文章 · 获赞 9 · 访问量 3522

猜你喜欢

转载自blog.csdn.net/zdy_lyq/article/details/104366193