@Mr-13
2020-10-07T08:14:13.000000Z
字数 8830
阅读 150
工作手机
MQTT 是轻量的(Lightweight)、发布订阅模式(PubSub) 的物联网消息协议。而EMQ(Erlang Enterprise Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。
具体可以查看官方文档:https://developer.emqx.io/docs/broker/v3/cn/
RHEL以及他的衍生发行版如CentOS、Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpm repository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了;如果既想获得 RHEL 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能;那么epel恰恰可以解决这两方面的问题。
什么是EPEL?
EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
如果你知道rpmfusion.org的话,拿 rpmfusion 做比较还是很恰当的,rpmfusion 主要为桌面发行版提供大量rpm包,而EPEL则为服务器版本提供大量的rpm包,而且大多数rpm包在官方 repository 中是找不到的。
另外一个特点是绝大多数rpm包要比官方repository 的rpm包版本要来得新,比如我前些日子在CentOS上安装的php,RHEL为了稳定性还在延用5.1.6版,我记得这是去年上半年的版本,而php 的最新版本已经到5.3.2,如果在php5.1.6的基础上安装phpmyadmin,则会提示php版本过低,这时候,EPEL中提供的较新php rpm就能很方便的派上用场了。
# root用户下执行
# 创建软件包存放目录并进入
[root@mr13 ~]# mkdir -p /server/tools
[root@mr13 ~]# cd /server/tools/
# 安装wegt
[root@mr13 tools]# yum install -y wget
# 下载epel安装包
# wget https://mirrors.aliyun.com/centos/7.6.1810/extras/x86_64/Packages/epel-release-7-11.noarch.rpm
# 这个下载地址已经失效,使用本地之前已经下载好的包上传安装,上传过程不赘述
# 安装epel
[root@mr13 tools]# rpm -ivh epel-release-7-11.noarch.rpm
# 清除掉之前所有的内容
[root@mr13 tools]# yum clean all
# 安装依赖库:lksctp-tools
# sctp 工具包,以及sctp(流控制传输协议)在arm下的交叉编译后的库文件
[root@mr13 tools]# yum install -y lksctp-tools
.
# root用户下操作
# 下载emqtt安装包
[root@mr13 tools]# wget https://www.emqx.io/downloads/broker/v2.3.11/emqttd-centos7-v2.3.11.el7.centos.x86_64.rpm
# 安装emqtt
[root@mr13 tools]# rpm -ivh emqttd-centos7-v2.3.11.el7.centos.x86_64.rpm
.
#
# file-max : 系统级别所有进程可打开的文件数,是内核可分配的最大文件数
# 这个参数直接决定了能连接多少个客户端
#
# The value in file-max denotes the maximum number of file-handles
# that the Linux kernel will allocate. When you get lots of error
# messages about running out of file handles, you might want to
# increase this limit
#
# ---------------------------------------------------------------------------
#
# nr_open : 是单个进程可分配的最大文件数;nr_open 不能大于 file-max
#
# This denotes the maximum number of file-handles a process can
# allocate. Default value is 1024*1024 (1048576) which should be
# enough for most machines. Actual limit depends on RLIMIT_NOFILE
# resource limit.
#
# ---------------------------------------------------------------------------
#
# 可通过如下命令直接修改系统当前的参数,并立即生效;但重启后设置丢失,需要重新配置
#
# sysctl -w fs.file-max=2097152
# sysctl -w fs.nr_open=2097152
# echo 2097152 > /proc/sys/fs/nr_open
#
# ---------------------------------------------------------------------------
#
# 如要持久化,不需要开机重启可使用下列命令进行配置
#
[root@mr13 ~]# echo "fs.file-max = 2097152" >> /etc/sysctl.d/99-sysctl.conf
[root@mr13 ~]# echo "fs.nr_open = 2097152" >> /etc/sysctl.d/99-sysctl.conf
# 重新载入sysctl变量,对系统立即生效
[root@mr13 ~]# sysctl -p
# 执行完成,打印一下当前内核参数,如下图,说明配置已生效
sysctl 扩展
sysctl命令用于运行时配置内核参数,这些参数位于
/proc/sys
目录下。sysctl配置与显示在/proc/sys
目录中的内核参数。可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf
文件,即可手工或自动执行由sysctl控制的功能。
命令格式:
sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] -a
- 常用参数的意义:
-w
:临时改变某个指定参数的值(系统重启失效),如
sysctl -w net.ipv4.ip_forward=1
-a
:显示所有的系统参数
-p
:从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
CentOS 7的变化
在CentOS7下,打开sysctl.conf,如下:
如上图,sysctl相关配置在/etc/sysctl.d目录下的*.conf文件中配置即可,可以直接修改
99-sysctl.conf
也可以创建一个新的conf配置文件。执行sysctl -p
的时候,系统会重新加载这些配置内容。
.
这个参数优化项,可以理解为某个server可以打开的最大文件数量。
# root用户下操作
# 修改 /etc/systemd/system.conf 如下
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=1048576
# 将重新执行systemd 使修改的配置生效
[roor@mr13 ~]# systemctl daemon-reexec
# daemon-reload将重新加载所有单元文件,不是systemd本身的配置。
# systemctl daemon-reexec将重新执行systemd并导致其消化新配置的过程。
.
limits.conf 和sysctl.conf区别在于:
/etc/security/limits.conf
是针对用户;
/etc/sysctl.conf
是针对整个系统(内核)参数配置。
关于上述两个系统配置文件详细参数、以及下面操作的详细解释可参见:《limits.conf和sysctl.conf那些事儿》
ulimit其实就是对单一程序的限制,进程级别的。
/proc/sys/fs/file-max,该参数指定系统范围内所有进程可以打开的文件句柄的数量限制。
# root用户下操作
# 将每个进程可以打开的文件数目加大到1048576
# 这里的调整方式,只是临时改变了当前系统运行生效的值,重启设置丢失
[root@mr13 ~]# ulimit -n 1048576
# 修改配置文件,使设置永久生效
[root@mr13 ~]# vim /etc/security/limits.conf
# 修改/etc/security/limits.conf配置如下
* soft nofile 1048576
* hard nofile 1048576
.
相关优化参数详解参见:《limits.conf和sysctl.conf那些事儿》
# root用户下操作
(1)、
$ echo "net.core.somaxconn = 32768" >> /etc/sysctl.d/99-sysctl.conf
# 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
#
# web 应用中 listen 函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128
# 而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
(2)、
$ echo "net.ipv4.tcp_max_syn_backlog = 16384" >> /etc/sysctl.d/99-sysctl.conf
# 对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。
# 加大该值,可以容纳更多的等待连接的网络连接数。
#
# 同时该参数设置时,应不能比net.core.somaxconn数值大
#
# 默认值:128。推荐修改该,如8192、16384、262144。
(3)、
$ echo "net.ipv4.ip_local_port_range = 1000 65535" >> /etc/sysctl.d/99-sysctl.conf
# 本地发起连接时使用的端口范围,tcp初始化时会修改此值
#
# 默认为:32768 60999。建议至少为1000 65535
(4)、
$ echo "net.core.netdev_max_backlog=16384" >> /etc/sysctl.d/99-sysctl.conf
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
#
# 默认值为:1000
(5)、
$ echo "net.core.rmem_default = 262144" >> /etc/sysctl.d/99-sysctl.conf
# 设置 接收 TCP socket的缺省(默认)缓存大小(字节)。
#
# 根据硬件自动生成值为212992
(6)、
$ echo "net.core.wmem_default = 262144" >> /etc/sysctl.d/99-sysctl.conf
# 设置 发送 TCP socket的缺省(默认)缓存大小(字节)。
#
# 根据硬件自动生成值为212992
(7)、
$ echo "net.core.rmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
# 设置 接收 socket的 最大 缓存大小(字节)
#
# 根据硬件自动生成值为212992
(8)、
$ echo "net.core.wmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
# 设置 发送 socket的 最大 缓存大小(字节)
#
# 根据硬件自动生成值为212992
(9)、
$ echo "net.core.optmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
# 表示每个套接字所允许的最大缓冲区的大小。
#
# 默认值为20480,4G内存服务器推荐优化值为81920
(10)、
$ echo "net.ipv4.tcp_rmem = 1024 4096 16777216" >> /etc/sysctl.d/99-sysctl.conf
# 为TCP socket预留用于接收缓冲的内存的设置。
# 此文件中保存有三个值,分别是:
#
# Min:
# 为TCP socket预留用于接收缓冲的内存最小值。
# 每个tcp socket都可以在建立后使用它。
# 即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲
#
# --------------------------------------------------------------------------------------------
#
# Default:
# 为TCP socket预留用于接收缓冲的内存数量,
# 默认情况下该值会影响其它协议使用的net.core.rmem_default 值,一般要低于net.core.rmem_default的值。
# 该值决定了在:
# net.ipv4.tcp_adv_win_scale、
# net.ipv4.tcp_app_win、
# tcp_app_win=0
# 默认值情况下,TCP窗口大小为65535。
#
# --------------------------------------------------------------------------------------------
#
# Max:
# 用于TCP socket接收缓冲的内存最大值。
# 该值不会影响net.core.rmem_max,静态"选择参数SO_SNDBUF则不受该值影响。
#
#
# 根据硬件自动生成值为:4096 87380 6291456。按需修改。
(11)、
$ echo "net.ipv4.tcp_wmem = 1024 4096 16777216" >> /etc/sysctl.d/99-sysctl.conf
# 为TCP socket预留用于发送缓冲的内存的设置。
# 此文件中保存有三个值,分别是:
#
# Min:
# 为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建立后使用它。
#
# --------------------------------------------------------------------------------------------
# Default:
# 为TCP socket预留用于发送缓冲的内存数量,
# 默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。
#
# --------------------------------------------------------------------------------------------
#
# Max:
# 用于TCP socket发送缓冲的内存最大值。
# 该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。
#
# 根据硬件自动生成值为:4096 16384 4194304。按需修改。
(12)、
$ echo "net.ipv4.tcp_fin_timeout = 15" >> /etc/sysctl.d/99-sysctl.conf
# 本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。
#
# 默认值:60。建议修改为30或更低。
(13)、
$ echo "net.ipv4.tcp_max_tw_buckets = 1048576" >> /etc/sysctl.d/99-sysctl.conf
# 系统在同时所处理的最大timewait sockets 数目。
# 如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
#
# 默认值为8192。该参数可以适当调大,同时该不应该比net.ipv4.ip_local_port_range端口范围数值大很多。
#
# 重新载入sysctl变量,对系统立即生效
(14)、
# 重新载入sysctl变量,对系统立即生效
$ sysctl -p
.
emqttd消息服务器通过 etc/ 目录下配置文件进行设置,主要配置文件包括:
配置文件 | 说明 |
---|---|
etc/emq.conf | 消息服务器配置文件 |
etc/acl.conf | 默认ACL规则配置文件 |
etc/plugins/*.conf | 各类插件配置文件 |
可通过 etc/emq.conf
配置文件的node段落设置虚拟机配置
# root用户下操作
# 使用sed命令修改配置文件:/etc/emqttd/emq.conf
sed -ri 's#node.process_limit = 256000#node.process_limit = 2097152#g' /etc/emqttd/emq.conf
sed -ri 's#node.max_ports = 65536#node.max_ports = 1048576#g' /etc/emqttd/emq.conf
sed -ri 's#listener.tcp.external.acceptors = 16#listener.tcp.external.acceptors = 64#g' /etc/emqttd/emq.conf
sed -ri 's#listener.tcp.external.max_clients = 102400#listener.tcp.external.max_clients = 1000000#g' /etc/emqttd/emq.conf
# 说明:
# -r : 使用正则
# -i :在当前行执行操作
# sed 's#AAA#BBB#g' : 文档全局查找AAA并替换为BBB;# 在这里是分隔符(界定符)
# node.process_limit = 2097152 # 为此设置同时存在的进程的最大数量
# node.max_ports = 1048576 # 设置此系统的最大同时存在端口数
# listener.tcp.external.acceptors = 64 # 外部MQTT/TCP侦听器的接受器池
# listener.tcp.external.max_clients = 1000000 # 最大并发MQTT/TCP连接数。
.
sed -ri 's#listener.tcp.external = 127.0.0.1:1883#listener.tcp.external = 0.0.0.0:1883#g' /etc/emqttd/emq.conf
# listener.tcp.external = 0.0.0.0:1883 # 设置MQTT/TCP的IP地址和端口,允许公网访问
.
[root@mr13 ~]# chmod 1777 /tmp
# 启动emqtt
[root@mr13 ~]# systemctl start emqttd.service
# 查看emqtt运行状态
[root@mr13 ~]# systemctl status emqttd.service
.
# root用户下操作
[root@mr13 ~]# vim /etc/emqttd/plugins/emq_auth_username.conf
默认配置下,是没有有效可用的账号密码的,如下图:
修改配置文件如下,根据需要设置好账号密码:
# root用户下操作
# 加载用户插件,使所设置的用户生效
[root@mr13 ~]# emqttd_ctl plugins load emq_auth_username
emqttd消息服务器启动后,会默认加载Dashboard插件,启动Web管理控制台。用户可通过Web控制台, 查看服务器运行状态、统计数据、客户端(Client)、会话(Session)、主题(Topic)、订阅(Subscription)。
控制台地址: http://127.0.0.1:18083;
默认用户: admin,密码:public (127.0.0.1需要修改为自己本机部署的服务器地址)
CSDN一篇非常不错的EMQTT学习手册:
emqttd学习教程(一):emqttd安装与部署
emqttd学习教程(二):emqttd配置说明
emqttd学习教程(三):emqttd插件详解