Emqttd

基于高并发的 Erlang 语言和 OTP 平台设计,支持百万级连接和分布式集群,发布订阅模式的开源 MQTT 消息服务器

安装

目前无 RPM 包可用,只能从官网下载压缩包,解压缩后即可直接运行

  1. # 下载、解压缩
  2. cd /data/app
  3. curl -Lo emqttd.zip http://emqtt.io/downloads/latest/centos
  4. unzip emqttd.zip
  5. cd emqttd/
  6. # 查看命令帮助
  7. ./bin/emqttd --help
  8. ./bin/emqttd_ctl --help

配置

systemd service

创建 systemd service 以便管理

  1. sudo tee /etc/systemd/system/emqttd.service <<-'EOF'
  2. [Unit]
  3. Description=Emqttd server
  4. After=syslog.target network.target remote-fs.target nss-lookup.target
  5. [Service]
  6. Environment="HOME=/data/app/emqttd"
  7. Type=forking
  8. GuessMainPID=true
  9. ExecStartPre=/data/app/emqttd/bin/emqttd chkconfig
  10. ExecStart=/data/app/emqttd/bin/emqttd start
  11. ExecStop=/data/app/emqttd/bin/emqttd stop
  12. [Install]
  13. WantedBy=multi-user.target
  14. EOF
  15. sudo systemctl daemon-reload

管理命令:

  1. # 查看状态/启动/停止/重启
  2. sudo systemctl status/start/stop/restart emqttd
  3. # 启用/禁用自动启动
  4. sudo systemctl enable/disable emqttd

防火墙

emqttd 默认使用以下端口:

  • 1883: MQTT Port
  • 8883: MQTT(SSL) Port
  • 8083: MQTT(WebSocket), HTTP API Port
  • 18083: Web Dashboard

需配置防火墙以允许外网连接这些端口:

  1. sudo tee /etc/firewalld/services/emqtt.xml <<-'EOF'
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <service>
  4. <short>Emqtt</short>
  5. <description>The massively scalable MQTT broker</description>
  6. <port protocol="tcp" port="1883"/>
  7. <port protocol="tcp" port="8803"/>
  8. <port protocol="tcp" port="8083"/>
  9. <port protocol="tcp" port="18083"/>
  10. </service>
  11. EOF
  12. sudo firewall-cmd --reload
  13. sudo firewall-cmd --permanent --zone=dmz --add-service=emqtt
  14. sudo firewall-cmd --zone=dmz --add-service=emqtt

若使用了非默认端口,需相应修改 /etc/firewalld/services/emqtt.xml

认证

安全起见,要对客户端(包括发布者、订阅者)进行认证

emqttd 支持 ClientID、用户名/密码、IP地址、HTTP Cookie 等多种认证方式

我们使用用户名/密码认证方式,并使用 ACL 控制权限(发布、订阅)

不同类型的客户端使用不同的账号,分配尽量少的权限(操作,topic),以减少安全隐患

  1. 添加用户名/密码

    修改 etc/emqttd.config 中的 emqttd -> access -> auth:

    1. {username, [{"username", "password"}, {"username2", "password2"}]},
  2. 控制权限

    修改 etc/acl.config

    1. {allow, all}.
    2. {deny, {user, "subscriber"}, publish, ["$SYS/#", "#"]}.

    ACL 中的用户名必须存在于 etc/emqttd.config 中,否则 emqttd 启动失败

Web 管理

插件 emqttd_dashboard 提供了一个 Web 管理界面,访问地址为 http://server_addr:10803

默认账号为:

  • 用户名:admin
  • 密码:public

安装后应立即修改默认密码

参考资料