Docker+Emqx+Nginx集群及负载均衡的搭建 MQTT服务器

发布时间 2023-07-06 14:18:26作者: 春游去动物园

Docker+Emqx+Nginx集群及负载均衡的搭建 MQTT服务器

1.拉取镜像

docker pull emqx/emqx

2.创建虚拟网络

# -d 参数默认为bridge,可省略
docker network create -d bridge --subnet=172.18.0.0/16 emqx_bridge

3.创建Docker容器

#节点1
docker run -d --hostname emqx01 --name emqx01 --network emqx_bridge --ip 172.18.0.2 -p 60001:1883 -p 60004:8083 -p 60007:8883 -p 60010:8084 -p 60017:18083 -p 60013:11883 emqx/emqx

#节点2
docker run -d --hostname emqx02 --name emqx02 --network emqx_bridge --ip 172.18.0.3 -p 60002:1883 -p 60005:8083 -p 60008:8883 -p 60011:8084 -p 60018:18083 -p 60014:11883 emqx/emqx
 
#节点3
docker run -d --hostname  emqx03 --name emqx03 --network emqx_bridge --ip 172.18.0.4 -p 60003:1883 -p 60006:8083 -p 60009:8883 -p 60012:8084 -p 60019:18083 -p 60015:11883 emqx/emqx

4.修改配置

1.将每一个节点的emqx.conf文件都修改

cd /opt/emqx/etc
vi emqx.conf

大概在第10行  cluster.name = emqxcl   # 集群名称

大概第33行 	  cluster.discovery = manual

大概第187行   node.name = emqx01@172.18.0.2  # 节点名称emqx@ip  #记得ip要写节点所在的ip

另外2个节点只有node.name不一样,其他配置一样
emqx02:node.name = emqx01@172.18.0.3
emqx03:node.name = emqx01@172.18.0.4


这里我使用了docker虚拟网络 并给每一个容器分配了ip所以写172.18.0.2,如果是在不同服务器上的节点,请写所在服务器的ip地址

5.加入集群(一定要先完成上面的配置)

分别进入emqx02和emqx03 两个容器中执行

cd /opt/emqx/etc

emqx_ctl cluster join emqx01@172.18.0.2

最后在任一容器中查看集群

./bin/emqx_ctl cluster status

结果如下,说明配置成功
也可以进去web页面查看 (ip改为自己的ip)
http://ip:60017
http://ip:60018
http://ip:60019都可以查看

我们可以访问3个容器的web管理页面,默认18083是web端口,因为容器做了映射所以要访问60017,60018,60019

6.Nginx负载均衡

1.拉取镜像

docker pull nginx

2.启动容器

docker run --name nginx -p 80:80 -d nginx

3.本地映射配置文件

mkdir -p /data/nginx
 
mkdir -p /data/nginx/www
 
mkdir -p /data/nginx/conf
 
mkdir -p /data/nginx/logs

4.复制配置文件到主机

docker cp 容器id:/etc/nginx/nginx.conf /data/nginx/
 
docker cp 容器id:/etc/nginx/conf.d /data/nginx/conf/
 
docker cp 容器id:/usr/share/nginx/html/ /data/nginx/www/
 
docker cp 容器id:/var/log/nginx/ /data/nginx/logs/

5.移除nginx容器

docker stop 容器id    
docker rm  容器id

6.配置文件编辑

/data/nginx/conf/default.conf此处文件配置不变

/data/nginx/nginx.conf 配置文件进行修改

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
events {
    worker_connections  1024;
}
 
stream{
    upstream emqxTcp {
        server ip:60001 weight=1;  # 其中的ip为宿主机的ip地址  60001为容器中1883端口在宿主机上的映射端口
        server ip:60002 weight=1;
        server ip:60003 weight=1;
    }
    server {
        listen 1883;
        proxy_pass emqxTcp;
    }
}


'''
	这里需要注意nginx需要安装  stream模块,不然会报错
'''