配置说明 (Configuration)

    EMQ X 配置变更历史

    为方便用户与插件开发者使用,EMQ X 配置文件经过四次调整。

    1. EMQ X 1.x 版本采用 Erlang 原生配置文件格式 etc/emqttd.config:

    Erlang 的原生配置格式多层级嵌套,对非 Erlang 开发者的用户很不友好。

    1. EMQ X 2.0-beta.x 版本简化了原生 Erlang 配置文件,采用类似 rebar.config 或 relx.config 格式:
    1. {mqtt_max_clientid_len, 512}.
    2. %% Max Packet Size Allowed, 64K by default.
    3. {mqtt_max_packet_size, 65536}.
    4. %% Client Idle Timeout.
    5. {mqtt_client_idle_timeout, 30}. % Second

    简化后的 Erlang 原生配置格式方便用户配置,但插件开发者不得不依赖 gen_conf 库,而不是通过 appliaton:get_env 读取配置参数。

    1. EMQ X 2.0-rc.2 正式版集成了 cuttlefish 库,采用了类似 sysctl 的 k = v 通用格式,并在系统启动时翻译成 Erlang 原生配置格式:
    1. ## Node name
    2. node.name = emq@127.0.0.1
    3. ## Max ClientId Length Allowed.
    4. mqtt.max_clientid_len = 1024
    1. EMQ X 3.0-beta.1 测试版正式更名 emqttd 为 emqx ,配置名称与配置信息进行相关变化:
    1. ## Profile
    2. etc/emq.config ==> etc/emqx.config
    3. ## Node name
    4. 原先:
    5. node.name = emq@127.0.0.1
    6. 现在:
    7. node.name = emqx@127.0.0.1

    EMQ X 启动时配置文件处理流程:

    1. ---------------------- 3.0/schema/*.schema -------------------
    2. | etc/emqx.conf | ----------------- \|/ | data/app.config |
    3. | + | --> mergeconf --> | data/app.conf | --> cuttlefish generate --> | |
    4. | etc/plugins/*.conf | ----------------- | data/vm.args |
    5. ---------------------- -------------------

    EMQ X 环境变量

    EMQ X 集群设置

    集群名称:

    1. cluster.name = emqxcl

    集群发现策略:

    1. cluster.discovery = manual

    启用集群自愈:

    1. cluster.autoheal = on

    宕机节点自动清除周期:

    1. cluster.autoclean = 5m

    EMQ X 集群自动发现

    EMQ X 版本支持多种策略的节点自动发现与集群:

    manual 手动创建集群

    默认配置为手动创建集群,节点通过 ./bin/emqx_ctl join <Node> 命令加入:

    1. cluster.discovery = manual

    基于 static 节点列表自动集群

    集群发现策略为 static:

    1. cluster.discovery = static

    静态节点列表:

    1. cluster.static.seeds = emqx1@127.0.0.1,emqx2@127.0.0.1

    基于 mcast 组播自动集群

    集群发现策略为 mcast:

    1. cluster.discovery = mcast

    IP 组播地址:

    1. cluster.mcast.addr = 239.192.0.1

    组播端口范围:

    1. cluster.mcast.ports = 4369,4370

    网卡地址:

    1. cluster.mcast.iface = 0.0.0.0

    组播 TTL:

    1. cluster.mcast.ttl = 255

    是否循环发送组播报文:

    1. cluster.mcast.loop = on

    基于 DNS A 记录自动集群

    集群发现策略为 dns:

    1. cluster.discovery = dns

    dns 名字:

    1. cluster.dns.name = localhost

    用于和 IP 地址一起构建节点名字的应用名字:

    1. cluster.dns.app = emqx

    基于 etcd 自动集群

    集群发现策略为 etcd:

    1. cluster.discovery = etcd

    etcd 服务器列表,以 , 进行分隔:

    1. cluster.etcd.server = http://127.0.0.1:2379

    用于 etcd 中节点路径的前缀,集群中的每个节点都会在 etcd 创建以下路径: v2/keys/<prefix>/<cluster.name>/<node.name>:

    1. cluster.etcd.prefix = emqxcl

    etcd 中节点的 TTL:

    1. cluster.etcd.node_ttl = 1m

    包含客户端私有 PEM 编码密钥文件的路径:

    1. cluster.etcd.ssl.keyfile = etc/certs/client-key.pem

    包含客户端证书文件的路径:

    1. cluster.etcd.ssl.certfile = etc/certs/client.pem

    包含 PEM 编码的CA证书文件的路径:

    1. cluster.etcd.ssl.cacertfile = etc/certs/ca.pem

    基于 Kubernetes 自动集群

    集群发现策略为 k8s:

    1. cluster.discovery = k8s

    Kubernetes API 服务器列表,以 , 进行分隔:

    1. cluster.k8s.apiserver = http://10.110.111.204:8080

    帮助查找集群中的 EMQ X 节点的服务名称:

    1. cluster.k8s.service_name = emqx

    用于从 k8s 服务中提取 host 的地址类型:

    1. cluster.k8s.address_type = ip

    EMQ X 的节点名称:

    1. cluster.k8s.app_name = emqx

    Kubernetes 的命名空间:

    1. cluster.k8s.namespace = default

    EMQ X 节点与 Cookie

    Erlang 节点名称:

    1. node.name = emqx@127.0.0.1

    Erlang 分布式节点间通信 Cookie:

    1. node.cookie = emqxsecretcookie

    注解

    Erlang/OTP 平台应用多由分布的 Erlang 节点(进程)组成,每个 Erlang 节点(进程)需指配一个节点名,用于节点间通信互访。 所有互相通信的 Erlang 节点(进程)间通过一个共用的 Cookie 进行安全认证。

    EMQ X 节点连接方式

    EMQ X 节点基于 Erlang/OTP 平台的 IPv4, IPv6 或 TLS 协议连接:

    1. ## 指定 Erlang 分布式通信协议: inet_tcp | inet6_tcp | inet_tls
    2. node.proto_dist = inet_tcp
    3. ## 指定 Erlang 分布式通信 SSL 的参数配置
    4. ## node.ssl_dist_optfile = etc/ssl_dist.conf

    Erlang 运行时系统的心跳监控功能。注释此行以禁用心跳监控,或将值设置为 on 启用:

    1. node.heartbeat = on

    异步线程池中的线程数,有效范围为 0-1024:

    1. node.async_threads = 32

    Erlang 虚拟机允许的最大进程数,一个 MQTT 连接会消耗 2 个 Erlang 进程:

    1. node.process_limit = 2048000

    Erlang 虚拟机允许的最大 Port 数量,一个 MQTT 连接消耗 1 个 Port:

    1. node.max_ports = 1024000

    分配缓冲区繁忙限制:

    1. node.dist_buffer_size = 8MB

    ETS 表的最大数量。注意,mnesia 和 SSL 将创建临时 ETS 表:

    1. node.max_ets_tables = 256000

    调整 GC 以更频繁地运行:

    1. node.fullsweep_after = 1000

    崩溃转储日志文件位置:

    1. node.crash_dump = log/crash.dump

    指定 Erlang 分布式协议:

    1. node.proto_dist = inet_tcp

    Erlang 分布式使用 TLS 时存储 SSL/TLS 选项的文件:

    1. node.ssl_dist_optfile = etc/ssl_dist.conf

    分布式节点的滴答时间:

    1. node.dist_net_ticktime = 60

    Erlang 分布式节点间通信使用 TCP 连接的端口范围:

    1. node.dist_listen_min = 6396
    2. node.dist_listen_max = 6396

    RPC 参数配置

    RPC 模式 (sync | async):

    1. rpc.mode = async

    RPC async 模式的最大批量消息数:

    1. rpc.async_batch_size = 256

    RPC 本地监听的 TCP 端口:

    1. rpc.tcp_server_port = 5369

    RPC 对端监听的 TCP 端口:

    1. rpc.tcp_client_port = 5369

    RPC 的 TCP 连接个数:

    1. rpc.tcp_client_num = 32

    RPC 连接超时时间:

    1. rpc.connect_timeout = 5s

    RPC 发送超时时间:

    1. rpc.send_timeout = 5s

    认证超时时间:

    1. rpc.authentication_timeout = 5s

    同步调用超时时间:

    1. rpc.call_receive_timeout = 15s

    socket 空闲时最大保持连接时间:

    1. rpc.socket_keepalive_idle = 900

    socket 保活探测间隔:

    1. rpc.socket_keepalive_interval = 75s

    关闭连接前心跳探测最大失败次数:

    1. rpc.socket_keepalive_count = 9

    RPC 的 TCP 发送缓存大小:

    1. rpc.socket_sndbuf = 1MB

    RPC 的 TCP 发送缓存大小:

    1. rpc.socket_recbuf = 1MB

    RPC 的 Socket (用户态)缓存大小:

    1. rpc.socket_buffer = 1MB

    日志参数配置

    日志输出位置,可设置写到终端或写到文件:

    1. log.to = both

    设置日志级别:

    1. log.level = error

    设置 primary logger level,以及所有到文件和终端的 logger handlers 的日志级别。

    设置日志文件的存储路径:

    1. log.dir = log

    设置存储 “log.level” 日志的文件名:

    1. log.file = emqx.log

    设置每个日志文件的最大大小:

      设置循环日志记录的最大文件数量:

      1. log.rotation.count = 5

      可以通过配置额外的 file logger handlers,将某个级别的日志写到单独的文件,配置格式为 log.$level.file = $filename.

      例如,下面的配置将所有的大于等于 info 级别的日志额外写到 info.log 文件中:

      1. log.info.file = info.log

      匿名认证与 ACL 文件

      是否允许客户端以匿名身份通过验证:

      1. allow_anonymous = true

      EMQ X 支持基于内置 ACL 以及 MySQL、 PostgreSQL 等插件的 ACL。

      设置所有 ACL 规则都不能匹配时是否允许访问:

      1. acl_nomatch = allow

      设置存储 ACL 规则的默认文件:

      1. acl_file = etc/acl.conf

      设置是否允许 ACL 缓存:

      1. enable_acl_cache = on

      设置每个客户端 ACL 最大缓存数量:

      1. acl_cache_max_size = 32

      设置 ACL 缓存的有效时间:

      1. acl_cache_ttl = 1m

      etc/acl.conf 访问控制规则定义:

      1. 允许|拒绝 用户|IP地址|ClientID 发布|订阅 主题列表

      访问控制规则采用 Erlang 元组格式,访问控制模块逐条匹配规则:

      允许 dashboard 用户订阅 $SYS/#:

      1. {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.

      允许本机用户发布订阅全部主题:

      1. {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.

      拒绝除本机用户以外的其他用户订阅 $SYS/## 主题:

      1. {deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.

      允许上述规则以外的任何情形:

      1. {allow, all}.

      注解

      默认规则只允许本机用户订阅 $SYS/# 与 #。

      EMQ X 消息服务器接收到 MQTT 客户端发布(Publish)或订阅(Subscribe)请求时,会逐条匹配 ACL 规则,直到匹配成功返回 allow 或 deny。

      MQTT 协议参数配置

      MQTT 最大报文尺寸:

      1. mqtt.max_packet_size = 1MB

      ClientId 最大长度:

      1. mqtt.max_clientid_len = 65535

      Topic 最大层级,0 表示没有限制:

      1. mqtt.max_topic_levels = 0

      允许的最大 QoS:

      1. mqtt.max_qos_allowed = 2

      Topic Alias 最大数量,0 表示不支持 Topic Alias:

      1. mqtt.max_topic_alias = 0

      是否支持 MQTT 保留消息:

      1. mqtt.retain_available = true

      是否支持 MQTT 通配符订阅:

      1. mqtt.wildcard_subscription = true

      是否支持 MQTT 共享订阅:

      是否允许消息的 loop deliver:

      1. mqtt.ignore_loop_deliver = false

      此配置主要为 MQTT v3.1.1 使用,以实现 MQTT 5 中 No Local 的功能。

      MQTT Zones 参数配置

      EMQ X 使用 Zone 来管理配置组。一个 Zone 定义了一组配置项 (比如最大连接数等),Listener 可以指定使用某个 Zone,以使用该 Zone 下的所有配置。多个 Listener 可以共享同一个 Zone。

      Listener 使用配置的匹配规则如下,其优先级 Zone > Global > Default:

      1. --------- ---------- -----------
      2. Listeners -------> | Zone | --nomatch--> | Global | --nomatch--> | Default |
      3. --------- ---------- -----------
      4. | | |
      5. match match match
      6. \|/ \|/ \|/
      7. Zone Configs Global Configs Default Configs

      EMQ X 支持 zone.$name.xxx 替换成相应的 $name 的,这里的 zone.external.xxxzone.internal.xxx 中的 $name 都可以换成相应的名称,也可以新增自定义 namezone.$name.xxx

      TCP 连接建立后等待 MQTT CONNECT 报文的最长时间:

      1. zone.external.idle_timeout = 15s

      发布消息速率限制:

      1. ## zone.external.publish_limit = 10,100

      开启黑名单检查:

      1. zone.external.enable_ban = on

      开启 ACL 检查:

      1. zone.external.enable_acl = on

      是否统计每个连接的信息:

      1. zone.external.enable_stats = on

      设置连接/会话进程在接收多少消息或字节后强制进行 GC:

      1. zone.external.force_gc_policy = 1000|1MB

      设置连接/会话进程可使用的最大消息队列长度和堆大小,超出限制时将强制关闭进程:

      1. ## zone.external.force_shutdown_policy = 8000|800MB

      MQTT 最大报文尺寸:

      1. ## zone.external.max_packet_size = 64KB

      ClientId 最大长度:

      1. ## zone.external.max_clientid_len = 1024

      Topic 最大层级,0 表示没有限制:

      允许的最大 QoS:

      1. ## zone.external.max_qos_allowed = 2

      Topic Alias 最大数量,0 表示不支持 Topic Alias:

      1. ## zone.external.max_topic_alias = 0

      是否支持 MQTT 保留消息:

      1. ## zone.external.retain_available = true

      是否支持 MQTT 通配符订阅:

      1. ## zone.external.wildcard_subscription = false

      是否支持 MQTT 共享订阅:

      1. ## zone.external.shared_subscription = false

      服务器允许的保持连接时间,注释此行表示保持连接时间由客户端决定:

      1. ## zone.external.server_keepalive = 0

      Keepalive * backoff * 2 为实际的保持连接时间:

      1. zone.external.keepalive_backoff = 0.75

      允许的最大主题订阅数量,0 表示没有限制:

      1. zone.external.max_subscriptions = 0

      是否允许 QoS 升级:

      1. zone.external.upgrade_qos = off

      飞行窗口的最大大小:

      1. zone.external.max_inflight = 32

      QoS1/2 消息的重传间隔:

      1. zone.external.retry_interval = 20s

      等待 PUBREL 的 QoS2 消息最大数量(Client -> Broker),0 表示没有限制:

      1. zone.external.max_awaiting_rel = 100

      QoS2 消息(Client -> Broker)被删除前等待 PUBREL 的最大时间

      1. zone.external.await_rel_timeout = 300s

      MQTT v3.1.1 连接中使用的默认会话过期时间:

      1. zone.external.session_expiry_interval = 2h

      消息队列类型:

      1. zone.external.mqueue_type = simple

      消息队列最大长度:

      1. zone.external.max_mqueue_len = 1000

      主题优先级:

      1. ## zone.external.mqueue_priorities = topic/1=10,topic/2=8

      消息队列是否存储 QoS0 消息:

      1. zone.external.mqueue_store_qos0 = true

      是否开启 flapping 检测:

      1. zone.external.enable_flapping_detect = off

      指定时间内允许状态变化的最大次数:

      1. zone.external.flapping_threshold = 10, 1m

      flapping 禁止时间:

      1. zone.external.flapping_banned_expiry_interval = 1h

      Internal Zone 参数设置

      允许匿名访问:

      1. zone.internal.allow_anonymous = true

      是否统计每个连接的信息:

      1. zone.internal.enable_stats = on

      关闭 ACL 检查:

      1. zone.internal.enable_acl = off

      是否支持 MQTT 通配符订阅:

      1. ## zone.internal.wildcard_subscription = true

      是否支持 MQTT 共享订阅:

      1. ## zone.internal.shared_subscription = true

      允许的最大主题订阅数量,0 表示没有限制:

      1. zone.internal.max_subscriptions = 0

      飞行窗口的最大大小:

      1. zone.internal.max_inflight = 32

      等待 PUBREL 的 QoS2 消息最大数量(Client -> Broker),0 表示没有限制:

      1. zone.internal.max_awaiting_rel = 100

      消息队列最大长度:

      1. zone.internal.max_mqueue_len = 1000

      消息队列是否存储 QoS0 消息:

      1. zone.internal.mqueue_store_qos0 = true

      是否开启 flapping 检测:

      1. zone.internal.enable_flapping_detect = off

      指定时间内允许状态变化的最大次数:

      1. zone.internal.flapping_threshold = 10, 1m

      flapping 禁止时间:

      1. zone.internal.flapping_banned_expiry_interval = 1h

      MQTT Listeners 参数说明

      EMQ X 消息服务器支持 MQTT、MQTT/SSL、MQTT/WS 协议服务端,可通过 listener.tcp|ssl|ws|wss|.* 设置端口、最大允许连接数等参数。

      EMQ X 消息服务器默认开启的 TCP 服务端口包括:

      Listener 参数说明:

      EMQ X 版本支持配置多个 MQTT 协议监听器,例如配置名为 external、internal 两个监听器:

      TCP 监听器:

      1. listener.tcp.external = 0.0.0.0:1883

      接收池大小:

      1. listener.tcp.external.acceptors = 8

      最大并发连接数:

      1. listener.tcp.external.max_connections = 1024000

      每秒最大创建连接数:

      1. listener.tcp.external.max_conn_rate = 1000

      监听器使用的 Zone:

      1. listener.tcp.external.zone = external

      挂载点:

      1. ## listener.tcp.external.mountpoint = devicebound/

      TCP 数据接收速率限制:

      1. ## listener.tcp.external.rate_limit = 1024,4096

      访问控制规则:

      1. ## listener.tcp.external.access.1 = allow 192.168.0.0/24
      2. listener.tcp.external.access.1 = allow all

      EMQ X 集群部署在 HAProxy 或 Nginx 时,是否启用代理协议 V1/2:

      1. ## listener.tcp.external.proxy_protocol = on

      代理协议的超时时间:

      1. ## listener.tcp.external.proxy_protocol_timeout = 3s

      启用基于 X.509 证书的身份验证选项。EMQ X 将使用证书的公共名称作为 MQTT 用户名:

      1. ## listener.tcp.external.peer_cert_as_username = cn

      挂起连接的队列的最大长度:

      1. listener.tcp.external.backlog = 1024

      TCP 发送超时时间:

      1. listener.tcp.external.send_timeout = 15s

      发送超时时是否关闭 TCP 连接:

      1. listener.tcp.external.send_timeout_close = on

      用于 MQTT 连接的 TCP 接收缓冲区(os内核):

      1. #listener.tcp.external.recbuf = 2KB

      用于 MQTT 连接的 TCP 发送缓冲区(os内核):

      1. #listener.tcp.external.sndbuf = 2KB

      驱动程序使用的用户级软件缓冲区的大小,不要与选项 sndbuf 和 recbuf 混淆, 它们对应于内核套接字缓冲区。建议使用 val(buffer) >= max(val(sndbuf),val(recbuf)) 来避免不必要的复制带来的性能问题。当设置 sndbuf 或 recbuf 值时,val(buffer) 自动设置为上述最大值:

      1. #listener.tcp.external.buffer = 2KB

      是否设置 buffer = max(sndbuf, recbuf):

      1. ## listener.tcp.external.tune_buffer = off

      是否设置 TCP_NODELAY 标志。如果启用该选项,发送缓冲区一旦有数据就会尝试发送:

      1. listener.tcp.external.nodelay = true

      是否设置 SO_REUSEADDR 标志:

      1. listener.tcp.external.reuseaddr = true

      MQTT/SSL 监听器 - 8883

      SSL 监听端口:

      1. listener.ssl.external = 8883

      接收池大小:

      1. listener.ssl.external.acceptors = 16

      最大并发连接数:

      1. listener.ssl.external.max_connections = 102400

      每秒最大创建连接数:

      1. listener.ssl.external.max_conn_rate = 500

      监听器使用的 Zone:

      1. listener.ssl.external.zone = external

      挂载点:

      1. ## listener.ssl.external.mountpoint = devicebound/

      访问控制规则:

      1. listener.ssl.external.access.1 = allow all

      TCP 数据接收速率限制:

      1. ## listener.ssl.external.rate_limit = 1024,4096

      EMQ X 集群部署在 HAProxy 或 Nginx 时,是否启用代理协议 V1/2:

      1. ## listener.ssl.external.proxy_protocol = on

      代理协议的超时时间:

      1. ## listener.ssl.external.proxy_protocol_timeout = 3s

      TLS 版本,防止 POODLE 攻击:

      1. ## listener.ssl.external.tls_versions = tlsv1.2,tlsv1.1,tlsv1

      TLS 握手超时时间:

      1. listener.ssl.external.handshake_timeout = 15s

      包含用户私钥的文件的路径:

      1. listener.ssl.external.keyfile = etc/certs/key.pem

      包含用户证书的文件的路径:

      1. listener.ssl.external.certfile = etc/certs/cert.pem

      包含 CA 证书的文件的路径:

      1. ## listener.ssl.external.cacertfile = etc/certs/cacert.pem

      包含 dh-params 的文件的路径:

      1. ## listener.ssl.external.dhfile = etc/certs/dh-params.pem

      配置 verify 模式,服务器只在 verify_peer 模式下执行 x509 路径验证,并向客户端发送一个证书请求:

      1. ## listener.ssl.external.verify = verify_peer

      服务器为 verify_peer 模式时,如果客户端没有要发送的证书,服务器是否返回失败:

      1. ## listener.ssl.external.fail_if_no_peer_cert = true

      SSL cipher suites:

      1. listener.ssl.external.ciphers = ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA

      是否启动更安全的 renegotiation 机制:

      1. ## listener.ssl.external.secure_renegotiate = off

      是否允许客户端重用一个已存在的会话:

      1. ## listener.ssl.external.reuse_sessions = on
      1. ## listener.ssl.external.honor_cipher_order = on

      使用客户端证书中的 CN、EN 或 CRT 字段作为用户名。注意,“verify” 应该设置为 “verify_peer”:

      1. ## listener.ssl.external.peer_cert_as_username = cn

      挂起连接的队列的最大长度:

      1. ## listener.ssl.external.backlog = 1024

      TCP 发送超时时间:

      1. ## listener.ssl.external.send_timeout = 15s

      发送超时时是否关闭 TCP 连接:

      1. ## listener.ssl.external.send_timeout_close = on

      用于 MQTT 连接的 TCP 接收缓冲区(os内核):

      1. #listener.ssl.external.recbuf = 2KB

      用于 MQTT 连接的 TCP 发送缓冲区(os内核):

      1. ## listener.ssl.external.sndbuf = 4KB

      驱动程序使用的用户级软件缓冲区的大小,不要与选项 sndbuf 和 recbuf 混淆, 它们对应于内核套接字缓冲区。建议使用 val(buffer) >= max(val(sndbuf),val(recbuf)) 来避免不必要的复制带来的性能问题。当设置 sndbuf 或 recbuf 值时,val(buffer) 自动设置为上述最大值:

      1. ## listener.ssl.external.buffer = 4KB

      是否设置 buffer = max(sndbuf, recbuf):

      1. ## listener.ssl.external.tune_buffer = off

      是否设置 TCP_NODELAY 标志。如果启用该选项,发送缓冲区一旦有数据就会尝试发送:

      1. ## listener.ssl.external.nodelay = true

      是否设置 SO_REUSEADDR 标志:

      1. listener.ssl.external.reuseaddr = true

      MQTT/WebSocket 监听器 - 8083

      MQTT/WebSocket 监听端口:

      1. listener.ws.external = 8083

      接收池大小:

        最大并发连接数:

        1. listener.ws.external.max_connections = 102400

        每秒最大创建连接数:

        1. listener.ws.external.max_conn_rate = 1000

        TCP 数据接收速率限制:

        1. ## listener.ws.external.rate_limit = 1024,4096

        监听器使用的 Zone:

        1. listener.ws.external.zone = external

        挂载点:

        1. ## listener.ws.external.mountpoint = devicebound/

        访问控制规则:

        1. listener.ws.external.access.1 = allow all

        是否验证协议头是否有效:

        1. listener.ws.external.verify_protocol_header = on

        EMQ X 集群部署在 NGINX 或 HAProxy 之后,使用 X-Forward-For 来识别原始 IP:

        EMQ X 集群部署在 NGINX 或 HAProxy 之后,使用 X-Forward-Port 来识别原始端口:

        1. ## listener.ws.external.proxy_port_header = X-Forwarded-Port

        EMQ X 集群部署在 HAProxy 或 Nginx 时,是否启用代理协议 V1/2:

        1. ## listener.ws.external.proxy_protocol = on

        代理协议超时时间:

        1. ## listener.ws.external.proxy_protocol_timeout = 3s

        挂起连接的队列的最大长度:

        1. listener.ws.external.backlog = 1024

        TCP 发送超时时间:

        发送超时时是否关闭 TCP 连接:

        1. listener.ws.external.send_timeout_close = on

        用于 MQTT 连接的 TCP 接收缓冲区(os内核):

        1. ## listener.ws.external.recbuf = 2KB

        用于 MQTT 连接的 TCP 发送缓冲区(os内核):

        1. ## listener.ws.external.sndbuf = 2KB

        驱动程序使用的用户级软件缓冲区的大小,不要与选项 sndbuf 和 recbuf 混淆, 它们对应于内核套接字缓冲区。建议使用 val(buffer) >= max(val(sndbuf),val(recbuf)) 来避免不必要的复制带来的性能问题。当设置 sndbuf 或 recbuf 值时,val(buffer) 自动设置为上述最大值:

        1. ## listener.ws.external.buffer = 2KB

        是否设置 buffer = max(sndbuf, recbuf):

        1. ## listener.ws.external.tune_buffer = off

        是否设置 TCP_NODELAY 标志。如果启用该选项,发送缓冲区一旦有数据就会尝试发送:

        1. listener.ws.external.nodelay = true

        是否压缩 Websocket 消息:

        1. ## listener.ws.external.compress = true

        Websocket deflate 选项:

        1. ## listener.ws.external.deflate_opts.level = default
        2. ## listener.ws.external.deflate_opts.mem_level = 8
        3. ## listener.ws.external.deflate_opts.strategy = default
        4. ## listener.ws.external.deflate_opts.server_context_takeover = takeover
        5. ## listener.ws.external.deflate_opts.client_context_takeover = takeover
        6. ## listener.ws.external.deflate_opts.server_max_window_bits = 15
        7. ## listener.ws.external.deflate_opts.client_max_window_bits = 15

        最大空闲时间:

        1. ## listener.ws.external.idle_timeout = 2h

        最大报文大小,0 表示没有限制:

        1. ## listener.ws.external.max_frame_size = 0

        MQTT/WebSocket with SSL 监听器 - 8084

        MQTT/WebSocket with SSL 监听端口:

        1. listener.wss.external = 8084

        接收池大小:

        1. listener.wss.external.acceptors = 4

        最大并发连接数:

        1. listener.wss.external.max_connections = 16

        每秒最大创建连接数:

        1. listener.wss.external.max_conn_rate = 1000

        TCP 数据接收速率限制:

        1. ## listener.wss.external.rate_limit = 1024,4096

        监听器使用的 Zone:

        1. listener.wss.external.zone = external

        挂载点:

        1. ## listener.wss.external.mountpoint = devicebound/

        访问控制规则:

        1. listener.wss.external.access.1 = allow all

        是否验证协议头是否有效:

        1. listener.wss.external.verify_protocol_header = on

        EMQ X 集群部署在 NGINX 或 HAProxy 之后,使用 X-Forward-For 来识别原始 IP:

        1. ## listener.wss.external.proxy_address_header = X-Forwarded-For

        EMQ X 集群部署在 NGINX 或 HAProxy 之后,使用 X-Forward-Port 来识别原始端口:

        1. ## listener.wss.external.proxy_port_header = X-Forwarded-Port

        EMQ X 集群部署在 HAProxy 或 Nginx 时,是否启用代理协议 V1/2:

        1. ## listener.wss.external.proxy_protocol = on

        代理协议超时时间:

        1. ## listener.wss.external.proxy_protocol_timeout = 3s

        TLS 版本,防止 POODLE 攻击:

        1. ## listener.wss.external.tls_versions = tlsv1.2,tlsv1.1,tlsv1

        包含用户私钥的文件的路径:

        1. listener.wss.external.keyfile = etc/certs/key.pem

        包含用户证书的文件的路径:

        1. listener.wss.external.certfile = etc/certs/cert.pem

        包含 CA 证书的文件的路径:

        1. ## listener.wss.external.cacertfile = etc/certs/cacert.pem

        包含 dh-params 的文件的路径:

        1. ## listener.ssl.external.dhfile = etc/certs/dh-params.pem

        配置 verify 模式,服务器只在 verify_peer 模式下执行 x509 路径验证,并向客户端发送一个证书请求:

        1. ## listener.wss.external.verify = verify_peer

        服务器为 verify_peer 模式时,如果客户端没有要发送的证书,服务器是否返回失败:

        1. ## listener.wss.external.fail_if_no_peer_cert = true

        SSL cipher suites:

        1. ## listener.wss.external.ciphers = ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA

        是否启动更安全的 renegotiation 机制:

        1. ## listener.wss.external.secure_renegotiate = off

        是否允许客户端重用一个已存在的会话:

        1. ## listener.wss.external.reuse_sessions = on

        是否强制根据服务器指定的顺序而不是客户端指定的顺序设置密码:

        1. ## listener.wss.external.honor_cipher_order = on

        使用客户端证书中的 CN、EN 或 CRT 字段作为用户名。注意,“verify” 应该设置为 “verify_peer”:

        1. ## listener.wss.external.peer_cert_as_username = cn

        挂起连接的队列的最大长度:

        1. listener.wss.external.backlog = 1024

        TCP 发送超时时间:

        1. listener.wss.external.send_timeout = 15s

        发送超时时是否关闭 TCP 连接:

        1. listener.wss.external.send_timeout_close = on

        用于 MQTT 连接的 TCP 接收缓冲区(os内核):

        1. ## listener.wss.external.recbuf = 4KB

        用于 MQTT 连接的 TCP 发送缓冲区(os内核):

        1. ## listener.wss.external.sndbuf = 4KB

        驱动程序使用的用户级软件缓冲区的大小,不要与选项 sndbuf 和 recbuf 混淆, 它们对应于内核套接字缓冲区。建议使用 val(buffer) >= max(val(sndbuf),val(recbuf)) 来避免不必要的复制带来的性能问题。当设置 sndbuf 或 recbuf 值时,val(buffer) 自动设置为上述最大值:

        1. ## listener.wss.external.buffer = 4KB

        是否设置 TCP_NODELAY 标志。如果启用该选项,发送缓冲区一旦有数据就会尝试发送:

        1. ## listener.wss.external.nodelay = true

        是否压缩 Websocket 消息:

        1. ## listener.wss.external.compress = true

        Websocket deflate 选项:

        1. ## listener.wss.external.deflate_opts.level = default
        2. ## listener.wss.external.deflate_opts.mem_level = 8
        3. ## listener.wss.external.deflate_opts.strategy = default
        4. ## listener.wss.external.deflate_opts.server_context_takeover = takeover
        5. ## listener.wss.external.deflate_opts.client_context_takeover = takeover
        6. ## listener.wss.external.deflate_opts.server_max_window_bits = 15
        7. ## listener.wss.external.deflate_opts.client_max_window_bits = 15

        最大空闲时间:

        1. ## listener.wss.external.idle_timeout = 2h

        最大报文大小,0 表示没有限制:

        1. ## listener.wss.external.max_frame_size = 0

        Bridges 桥接

        桥接地址,使用节点名用于 rpc 桥接,使用 host:port 用于 mqtt 连接:

        1. bridge.aws.address = 127.0.0.1:1883

        桥接的协议版本:

        1. bridge.aws.proto_ver = mqttv4

        客户端的 client_id:

        1. bridge.aws.client_id = bridge_aws

        客户端的 clean_start 字段:

        1. bridge.aws.clean_start = true

        客户端的 username 字段:

        1. bridge.aws.username = user

        客户端的 password 字段:

        1. bridge.aws.password = passwd

        桥接的挂载点:

        1. bridge.aws.mountpoint = bridge/aws/${node}/

        要被转发消息的主题:

        1. bridge.aws.forwards = topic1/#,topic2/#

        客户端是否使用 SSL 来连接远程服务器:

        1. bridge.aws.ssl = off

        SSL 连接的 CA 证书 (PEM格式)

        1. bridge.aws.cacertfile = etc/certs/cacert.pem

        SSL 连接的 SSL 证书:

        1. bridge.aws.certfile = etc/certs/client-cert.pem

        SSL 连接的密钥文件:

        1. bridge.aws.keyfile = etc/certs/client-key.pem

        SSL 加密套件:

        1. #bridge.aws.ciphers = ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384

        TLS PSK 的密码:

        1. #bridge.aws.psk_ciphers = PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA

        客户端的心跳间隔:

        1. bridge.aws.keepalive = 60s

        支持的 TLS 版本:

        1. bridge.aws.tls_versions = tlsv1.2,tlsv1.1,tlsv1

        桥接的订阅主题:

        1. bridge.aws.subscription.1.topic = cmd/topic1

        桥接的订阅 qos:

        1. bridge.aws.subscription.1.qos = 1

        桥接启动类型:

        1. bridge.aws.start_type = manual

        桥接的重连间隔:

        1. bridge.aws.reconnect_interval = 30s

        QoS1/2 消息的重传间隔:

        1. bridge.aws.retry_interval = 20s

        飞行窗口大小:

        1. bridge.aws.max_inflight_batches = 32

        emqx_bridge 内部用于 batch 的消息数量:

        1. bridge.aws.queue.batch_count_limit = 32

        emqx_bridge 内部用于 batch 的消息字节数:

        1. bridge.aws.queue.batch_bytes_limit = 1000MB

        放置 replayq 队列的路径,如果没有在配置中指定该项,那么 replayq 将会以 mem-only 的模式运行,消息不会缓存到磁盘上:

        1. bridge.aws.queue.replayq_dir = {{ platform_data_dir }}/emqx_aws_bridge/

        replayq 数据段大小:

        1. bridge.aws.queue.replayq_seg_bytes = 10MB

        Modules 模块

        EMQ X 支持模块扩展,默认三个模块,分别为上下线消息状态发布模块、代理订阅模块、主题(Topic)重写模块。

        上下线消息状态发布模块

        是否启动上下线消息状态发布模块:

        1. module.presence = on

        上下线消息状态发布模块发布 MQTT 消息时使用的 QoS:

        1. module.presence.qos = 1

        是否启动代理订阅模块:

        1. module.subscription = off

        客户端连接时自动订阅的主题与 QoS:

        1. ## Subscribe the Topics's qos
        2. ## module.subscription.1.topic = $client/%c
        3. ## module.subscription.1.qos = 0
        4. ## module.subscription.2.topic = $user/%u
        5. ## module.subscription.2.qos = 1

        主题重写模块

        是否启动主题重写模块:

        1. module.rewrite = off

        主题重写规则:

        1. ## module.rewrite.rule.1 = x/# ^x/y/(.+)$ z/y/$1
        2. ## module.rewrite.rule.2 = y/+/z/# ^y/(.+)/z/(.+)$ y/z/$2

        扩展插件配置文件

        存放插件配置文件的目录:

        1. plugins.etc_dir = etc/plugins/

        存储启动时需要自动加载的插件列表的文件的路径:

        1. plugins.loaded_file = data/loaded_plugins

        EMQ X 插件配置文件,默认在 etc/plugins/ 目录,可修改 plugins.etc_dir 来调整目录。

        系统消息的发布间隔:

        1. broker.sys_interval = 1m

        是否全局注册会话:

        1. broker.enable_session_registry = on

        会话锁策略:

        1. broker.session_locking_strategy = quorum

        共享订阅的分发策略:

        1. broker.shared_subscription_strategy = random

        共享分发时是否需要 ACK:

        1. broker.shared_dispatch_ack_enabled = false

        是否开启路由批量清理功能:

        1. broker.route_batch_clean = on

        Erlang 虚拟机监控设置

        是否开启 long_gc 监控以及垃圾回收持续多久时会触发 long_gc 事件,设置为 0 表示不监控此事件:

        1. sysmon.long_gc = 0

        系统中的进程或端口不间断地运行多久时会触发 long_schedule 事件,设置为 0 表示不监控此事件:

        1. sysmon.long_schedule = 240

        垃圾回收导致分配的堆大小为多大时将触发 large_heap 事件:

        1. sysmon.large_heap = 8MB

        系统中的进程因为发送到繁忙端口而挂起时是否触发 busy_port 事件:

        1. sysmon.busy_port = false

        是否监控 Erlang 分布式端口繁忙事件:

        1. sysmon.busy_dist_port = true

        cpu 占用率的检查周期:

        1. os_mon.cpu_check_interval = 60s

        cpu 占用率高于多少时产生告警:

        1. os_mon.cpu_high_watermark = 80%

        cpu 占用率低于多少时清除告警:

        1. os_mon.cpu_low_watermark = 60%

        内存占用率的检查周期:

        1. os_mon.mem_check_interval = 60s

        系统内存占用率高于多少时产生告警:

        1. os_mon.sysmem_high_watermark = 70%

        单个进程内存占用率高于多少时产生告警:

        1. os_mon.procmem_high_watermark = 5%

        进程数量的检查周期:

        1. vm_mon.check_interval = 30s

        当前进程数量与进程数量最大限制的比率达到多少时产生告警:

          当前进程数量与进程数量最大限制的比率达到多少时清除告警:

          1. vm_mon.process_low_watermark = 60%