目录


摘要[TOC]

该文档是 ejabberd 配置的主入口点。ejabberd 非常强大,可以使用许多选项对它进行配置。但是,大多数情况下,只需要使用默认配置或对其进行少量修改,就已足够。


配置文件格式[TOC]

在以前的 ejabberd 版本中,配置文件需要使用 Erlang 语法书写。ejabberd 现在仍然支持这种格式,但是官方强烈推荐使用新的 YAML 格式的配置文件。下面将介绍 YAML 格式的配置文件。

ejabberd 在启动时,将加载配置文件。配置文件的扩展名必须是 .yml.yaml,这是因为ejabberd 根据扩展名,区分配置文件是 YAML格式的,还是遗留格式的。

在 YAML 中,不同的标量(scalar)将被当作不同的类型对待:

对于关联数组(也叫映射)和列表,既可以使用多行缩进语法书写,也可以使用 JSON 风格的压缩语法书写。比如:

等价。

注意,ejabberd 绝对不会编辑配置文件。因此,当通过 Web 管理接口修改配置参数时,应该手工地将这些修改应用到配置文件上。ejabberd 这样做是防止避免将配置文件弄乱。

ejabberd 将配置错误记录到 ejabberd.log 中。ejabberd 在其中记录语法相关的错误,以及关于未知选项的信息。


配置一或多个 XMPP 域[TOC]

主机名

ejabberd 支持在单个实例上管理多个独立的 XMPP 域。这种特性叫“虚拟主机”(virtual hosting)。

hosts 选项用于指定 ejabberd 将要服务的域名列表。

语法是:

比如:

虚拟主机

当在单个实例上管理多个 XMPP 域时,这些域完全独立。这意味着,它们可以拥有不同的配置参数。

可以通过 host_config 选项,分别为每个虚拟主机指定参数。

语法是:

比如:

如果想要为某些虚拟主机指定其专有的模块,可以先在全局使用 modules 选项为所有虚拟主机指定公共模块,然后使用 append_host_config 选项,为特定虚拟主机添加其专有的模块。

下面示例定义三个虚拟主机,它们有若干个相同的模块,但是某些虚拟主机也有其专有的模块:


Logging[TOC]

下面常用的 Logging 配置选项:


监听端口[TOC]

listen 选项用于指定 ejabberd 监听哪些端口、地址和网络协议,以及在它们上面运行哪些服务。该列表中的每个元素是一个关联数组,这些数组中包含下述元素:

语法是:

比如:

端口号、IP 地址和传输层协议

端口号用于指定在哪个端口上接收进入的连接。它既可以是 Jabber/XMPP 的标准端口号,也可以是任何其它可用端口号。

IP 地址是一个字符串。socket 只会监听指定的网络接口。当使用通用地址(IPV4 的通用地址是 "0.0.0.0",IPV6 的通用地址是 "::")时,ejabberd 将监听所有本地地址。ejabberd 根据 IP 地址的类型,决定使用 IPV4 还是 IPV6。当未指定 IP 地址时,它将监听所有 IPV4 网络地址。

注意,在某些操作系统或 OS 配置上,监听 "::",意味着监听所有 IPV4 及 IPV6 地址。

传输层协议可以是 tcp 或 udp,默认是 tcp。

监听模块

下面介绍可用的监听模块,它们的用途,以及每个模块支持的选项:

ejabberd_c2s:处理 c2s 连接

Options:accessciphersdhfileprotocol_optionsmax_fsm_queuemax_stanza_sizeshaperstarttlsstarttls_requiredtlszlibtls_compression

ejabberd_s2s_in:处理进入的 s2s 连接

Options:max_stanza_sizeshapertls_compression

ejabberd_service:与外部组件进行交互

Options:accesshostsmax_fsm_queuepasswordcheck_fromshaper_rule

ejabberd_sip:处理 SIP 请求

Options:certfiletls

ejabberd_stun:处理 STUN/TURN 请求

Options:certfiletlsuse_turnturn_ipturn_port_rangeturn_max_allocationsturn_max_permissionsshaperserver_nameauth_realmauth_type

ejabberd_http处理进入的 HTTP 连接。通过正确配置 request_handlers 选项,该模块可以提供 Web 管理、XMPP BOSH 和 Websocket 等服务

Options:captchadefault_hostdhfilerequest_handlerstlstls_compressiontrusted_proxies(global option)、web_admin

ejabberd_xmlrpc:处理 XML-RPC 请求,执行 ejabberd 命令

Options:access_commandsmaxsessionstimeout

选项说明

下面详细介绍监听模块支持的选项:

access: AccessName:为端口指定访问规则。默认值是 all

backlog: Value:用于指定挂起连接队列能够增长到的最大长度。如果服务器将要处理大量入向连接,那么应该调大该值。因为当该队列没空间时,这些连接可能被丢掉。默认值是 5

captcha: true|false:Simple web page that allows a user to fill a CAPTCHA challenge (see section CAPTCHA)

certfile: Path:包含默认 SSL 证书的文件的完整路径。如欲专门为某个域名指定证书文件,那么使用全局选项 domain_certfile

ciphers: Ciphers:OpenSSL 加密算法列表。其格式与 openssl ciphers 命令接受的格式相同

protocol_options: ProtocolOpts:与 SSL/TLS 相关的常用选项列表。默认条目是 no_sslv3|cipher_server_preference|no_compression

default_host: undefined|HostName:如果 ejabberd 接收的 HTTP 请求包含的 Host 头的值不匹配在 ejabberd 中指定的任何虚拟主机,那么配置的 HostName 将被设置为请求的 Host。该选项的默认值是 undefined

dhfile: Path:包含用于 DH 密钥交换的自定义参数的文件的完整路径。可以通过命令 openssl dhparam -out dh.pem 2048 创建该类文件。如果未指定该选项,那么使用默认参数,默认参数可能不会提供与使用自定义参数相同的安全级别

hosts: {Hostname: [HostOption, …]}:The external Jabber component that connects to this ejabberd_service can serve one or more hostnames. As HostOption you can define options for the component; currently the only allowed option is the password required to the component when attempt to connect to ejabberd: password: Secret. Note that you cannot define in a single ejabberd_service components of different services: add an ejabberd_service for each service, as seen in an example below. This option may not be necessary if the component already provides the host in its packets; in that case, you can simply provide the password option that will be used for all the hosts (see port 5236 definition in the example below)

http_bind: true|false:该选项用于开启 HTTP Binding 支持。HTTP Bind 支持从不允许 5222 端口上的出向 socket 通过的防火墙后面,通过 HTTP 请求访问 XMPP 服务。

记住,必须安装及启用 mod_bosh 模块,并且 ejabberd_c2s 监听模块也必须可用。

如果开启 HTTP Bind(Bosh),那么其地址是 http://server:port/bosh/。注意,对 HTTP Bind 的支持是 XMPP 客户端需要的,HTTP Bind 用于为基于 Web 的 XMPP 客户端(比如 JWChat)提供服务。

max_fsm_queue: Size:该选项用于指定 FSM(Finite State Machine)队列的最大元素数量。粗略地讲,这些队列中的每条消息代表一个将要被发送到相应的输出流的 XML 节。如果队列的大小达到限制(比如因为接收方太慢),FSM 和相应的连接将被终止,并且记录错误日志。该选项的合理值依赖硬件配置。可以为 ejabberd_serviceejabberd_c2s 监听模块指定该选项,也可以在全局为 ejabberd_s2s_out 监听模块指定该选项。如果没有为 ejabberd_serviceejabberd_c2s 监听模块指定该选项,那么将使用全局配置的值。允许的值是整型和 "undefined",默认值是1000。

max_stanza_size: Size:该选项用于指定 XML 节的近似最大大小,单位是字节。之所以说近似大小,是因为 ejabberd 以数据块为精度,计算该值。比如 {max_stanza_size, 65536}。默认值 infinity。对于 c2s 连接,建议值是 65536;对于 s2s 连接,建议值是 131072。s2s 的最大节大小必须高于 c2s 的限制。修改该值时,需要相当小心,因为如果设置得太低,将导致连接意外断开。

password: Secret:Specify the password to verify an external component that connects to the port.

request_handlers: {Path: Module}:用于指定一或多个为 HTTP 请求提供服务的处理模块。Path 是字符串,所有以 Path 开头的 URI 都将被 Module 服务。比如,在下面的示例中,mod_foo 为以 /a/b/ 开头的 URI 提供服务;mod_bosh 为以 /bosh/ 开头的 URI 提供服务:

check_from: true|false:This option can be used with ejabberd_service only. XEP-0114requires that the domain must match the hostname of the component. If this option is set to false, ejabberd will allow the component to send stanzas with any arbitrary domain in the ’from’ attribute. Only use this option if you are completely sure about it. The default value is true, to be compliant with XEP-0114

shaper: none|ShaperName:该选项用于为端口指定 shaper(请查看 Shaper)。默认值是 none

shaper_rule: none|ShaperRule:This option defines a shaper rule for the ejabberd_service(see section Shapers). The recommended value is fast

starttls: true|false:该选项用于指定在连接上,使用 STARTTLS 加密。设置该选项时,也应该设置 certfiles 选项

starttls_required: true|false:该选项用于指定在连接上,必须使用 STARTTLS 加密。非加密连接将不被接受。设置该选项时,也应该设置 certfiles 选项

timeout: Integer:连接的超时时间,单位是毫秒,默认值是 5000

tls: true|false:该选项用于指定在连接后,立即使用 SSL 对端口上的流量进行加密。这是早期的 Jabber 软件使用的传统加密方法,通常是在 5223 端口上,提供客户端-服务端通信。但是,如今不推荐该方法。比较合适的加密方法是(在 5222 端口上使用的)STRATTLS,可以使用 starttls 选项启用。如果设置该选项,那么也应该设置 certfilescertfile 选项。也可以在 ejabberd_http 使用 tls 选项,以支持 HTTPS

tls_compression: true|false:开启或禁用 TLS 压缩,默认值是 false

use_proxy_protocol: true|false:如果监听模块是被使用(用于给 ejabberd 提供真实的客户端 IP 地址)代理协议的代理服务访问的,那么设置为 true,否则设置为 false。关于代理协议,请阅读 http://www.haproxy.org/download/1.8/doc/proxy-protocol.txthttps://www.jianshu.com/p/cc8d592582c9。该选项的默认值是 false

zlib: true|false:该选项用于指定在连接上,使用 zlib 流压缩

全局选项

在 ejabberd 配置文件中,可以指定一些全局选项:

certfiles: List of paths:该选项接受包含 PEM 证书或 PEM 私钥的文件路径(可以包含通配符)的列表。在启动时,ejabberd 对证书进行排序,找到匹配的私钥,重建完整的证书链。当在 ejabberd_c2sejabberd_s2sejabberd_http 中使用 starttlstls 之类的选项时,使用该选项

c2s_cafile:包含一或多个 PEM 格式的 CA 证书的文件的完整路径。所有客户端证书都应该被其中一个根证书签名;并且客户端证书的 subjectAltName 域应该包含相应的 JID

c2s_ciphers: Ciphers:OpenSSL 加密算法列表,其格式与 openssl ciphers 命令接受的格式相同

c2s_dhfile: Path:包含自定义 DH 参数的文件的完整路径。可以通过 openssl dhparam -out dh.pem 2048 命令创建此类文件。如果未指定该选项,那么使用默认参数,它可能不会提供与使用自定义参数相同的安全级别

c2s_protocol_options: ProtocolOpts:与 SSL/TLS 相关的常用选项的列表。默认条目是 no_sslv3|cipher_server_preference|no_compression

c2s_tls_compression: true|false:对于 c2s 连接,开启或关闭 TLS 压缩,默认值是 false

s2s_use_starttls: false|optional|required|required_trusted:该选项用于指定,s2s 连接是否不使用 STARTTLS 加密;是否可选地使用 STARTTLS;是否必须使用 STARTTLS;或者是否必须使用 STARTTLS,并且远程证书必须被验证和信任。务必注意,不建议使用required_trusted,并且将来的发行版不再支持该选项。替代方案是,将该选项设置为required,并且确保不加载 mod_s2s_dialback。默认值是不使用 STARTTLS,即 false

s2s_certfile: Path:包含 SSL 证书的文件的完整路径

s2s_dhfile: Path:包含自定义 DH 参数的文件的完整路径。可以通过 openssl dhparam -out dh.pem 2048 命令创建此类文件。如果未指定该选项,那么使用默认参数,它可能不会提供与使用自定义参数相同的安全级别

domain_certfile: Path:包含用于特定域名的 SSL 证书的文件的完整路径

s2s_ciphers: Ciphers:OpenSSL 加密算法列表,其格式与 openssl ciphers 命令接受的格式相同

s2s_protocol_options: ProtocolOpts:与 SSL/TLS 相关的常用选项的列表。默认条目是 no_sslv3|cipher_server_preference|no_compression

outgoing_s2s_families: [Family, ...]:指定以何种顺序,尝试哪些地址家族。默认情况下,ejabberd 先尝试使用 IPv4 进行连接;如果失败,那么尝试使用 IPv6

outgoing_s2s_timeout: Timeout:出向 s2s 连接的超时时间,单位是秒

s2s_access: Access:用于到其它 XMPP 服务的入向和出向 s2s 连接策略。默认值是 all。可以通过将该选项设置为 none,禁止到其它服务(联邦)的连接。但是这样不会阻止本地提供的服务,因为,由于性能原因,这些服务是在内部连接的,而不是通过 s2s 模块。如果想要阻止这些服务,需要使用额外模块,比如 mod_isolation

s2s_dns_timeout: Timeout:DNS 解析的超时时间,单位是秒,默认值是 10

s2s_dns_retries: Number:DNS resolving retries in seconds. The default value is 2

s2s_max_retry_delay: Seconds:在连接失败后,尝试重连前,允许的最大延迟,单位是秒,默认值是 300 秒(5分钟)

s2s_tls_compression: true|false:对于 s2s 连接,是否开启 TLS 压缩,默认值是 false

c2s_hibernate: Timeout|hibernate:在 c2s 进程进入休眠之前,等待的超时时间,单位是毫秒,默认值是 90000

receiver_hibernate: Timeout|hibernate:在 receiver 进程进入休眠之前,等待的超时时间,单位是毫秒,默认值是 90000

route_subdomains: local|s2s:用于指定 ejabberd 必须在本地将节直接路由到子域(参考附录 1);还是使用 S2S 路由到外部服务(参考附录 2

trusted_proxies: all | [IpString]:用于指定,当 HTTP 请求包含 X-Forwarded-For 头时,信任哪些代理。可以将该选项设置为 all(允许所有代理)或字符串形式的 IP 列表。默认值是 ["127.0.0.1"]。开启该选项,能够让 ejabberd 知道请求的真实 IP。需要注意,如果开启该选项,那么代理必须设置 X-Forwarded-For 头,否则,客户端可以自己设置它,进而导致 IP 值不被 ejabberd 中的安全规则信任

配置示例

下面的示例中:


认证[TOC]

auth_method 选项用于指定用于用户认证的认证方法。语法是:

ejabberd 支持下列认证方法:

当忽略该选项时,ejabberd 将根据通过 default_db 选项配置的默认数据库,决定使用哪种认证方法。如果 default_db 选项也未被设置,那么默认的认证方法是 internal

只有 internal、external 和 sql 方法支持创建账户。

resource_conflict 选项用于指定,当客户端尝试使用已经连接的资源登陆账户时,服务端执行的行为。语法是:

该选项的三个可选值对应 XMPP Core: section 7.7.2.2 中描述的三种可能性。默认值是 closeold

其中:

本文只介绍 external 认证方式,关于其它认证方式,请自行查阅官方文档

外部脚本

如果使用这种认证方法,ejabberd 在启动时,将启动一个脚本,然后调用它们执行认证任务。

开发人员可以使用任何语言编写外部认证脚本。ejabbed Developers Guide 描述 ejabberd 和脚本之间的接口细节。

在使用 external 认证方式时,需要配置下述选项:

下面的示例设置外部认证方法,外部认证脚本,关闭缓存,并且为每个虚拟主机启动 3 个脚本实例:


访问规则[TOC]

本章节介绍在 ejabberd 16.06 中引入的新 ACL 语法。如果想要了解以前的访问规则和 ACL 语法,请参考 configuration document archive

ACL 的定义

在 ejabberd 中,访问控制通过访问控制列表(ACL)来执行。定义 ACL 的语法如下所示:

ACLType: ACLValue 的取值如下:

下面的 ACLName 是预定义的:

访问权限

access_rules 中定义的访问规则用于允许或禁止对不同服务的访问。语法是:

访问规则的定义中可以包含任意数量的 - allow- deny 区域。每个区域可以包含任意数量的 ACL 规则(acl: RuleName 在名称为 RuleName 的 ACL 规则匹配时匹配)。如果未指定 ACL 规则或 ACL 规则未被定义,那么使用规则 all

ejabberd 按照从上到下的顺序处理定义中的 - allow- deny 区域。当某个区域列出的所有 ACL 规则都匹配时,则把它作为访问规则的结果。否则,访问规则的结果是 deny

为简化配置,- allow: acl 可以简写为 - allow- deny: acl 可以简写为 - deny。在下面的例子中,短版本定义和长版本定义是等价的:

值得注意的是,在全局定义的访问权限的优先级高于在虚拟主机中定义的访问权限的优先级。这意味着,在发生冲突的情况下,将使用在全局定义的授予或禁止权限,而在虚拟主机中定义的权限不生效。

比如:

下面的 AccessName 是预定义的:

all:始终返回 allow

none:始终返回 deny

流量控制

shaper 用于限制连接上的流量(connection traffic)。语法是:

其中,Rate 代表 ejabberd 允许的最大传入速率(单位是字节/秒)。当达到该限制时,ejabberd 将停止从 socket 上读取数据,直到平均速率再次低于允许的最大速率。

比如:

流量控制规则

shaper_rules 用于为用户或主机声明要使用的 shaper。语法是:

语义与访问权限中的描述相似。唯一的区别是,在访问权限中使用的是 - allow- deny;在 shaper_rules 中使用的是 shaper 的名称或数字。

比如:

使用 ACL 限制用户的会话数量

max_user_sessions 用于指定每个用户的最大会话数量。如果用户尝试使用不同的资源打开更多会话,那么 ejabberd 将断开第一个会话。错误 session replaced 将被发送给被断开的会话。该选项的值既可以是数值,也可以是 infinity。默认值是 infinity

语法是:

在下面的例子中,admin 的最大会话数量被限制为 10,其它用户的最大会话数量被限制为 5:

使用 ACL 限制到远程 XMPP 服务的连接数量

max_s2s_connections 用于指定,对于某个特定远程 XMPP 服务,ejabberd 能建立多少个并发的 s2s 连接。默认值是 1。

语法是:

比如:


数据库和 LDAP 配置[TOC]

默认情况下,ejabberd 使用其内部的 mnesia 数据库。但 ejabberd 也可以使用关系型数据库、key-value 存储或 LDAP 服务存储持久的、生命周期较长的数据。ejabberd 非常灵活,可以为不同的虚拟主机配置不同的认证方法;可以为同一个虚拟主机配置不同的认证机制(fallback);可以为不同的模块设置不同的存储系统等。

ejabberd 支持下列数据库:

需要注意,如果在 ejabberd.yml 中指定多个域名,并且为了用户名不会在不同的虚拟主机之间发生冲突和混淆,需要每个虚拟主机使用不同的数据库、认证和存储配置。此时,必须在 host_config 内,为每个虚拟主机设置接下来要介绍的选项。比如:

关系型数据库

ejabberd 支持两种数据库模式。当使用默认的遗留模式时,一个数据库只能处理一个 XMPP 域名。新模式允许在单个数据库中,处理多个 XMPP 域名。当 ejabberd 实例为多个域名提供服务,或者偶尔改变域名时,使用新模式是最好的。因为这样可以避免管理多个数据库,以及处理复杂的配置变更。

当使用关系型数据库存储数据时,需要根据数据库类型和使用的模式(遗留模式或新模式),从这个列表中选择合适的 SQL 文件,并且把其中定义的模式上传到 SQL 服务。比如当使用 MySQL,并且选择默认模式时,应该选择 mysql.sql;当使用 PostgresSQL,并且选择新模式时,应该选择 pg.new.sql。

当选择新模式时,必须向 ejabberd.yml 配置文件中添加下述配置:

真正的数据库访问通过带有 sql_ 前缀的选项指定:

下面是明文 ODBC 连接的示例:

下面是 MySQL 连接的示例:

SQL 认证

ejabberd 可以使用 SQL 数据库认证用户。请参考认证中的 auth_method 选项。

在使用 SQL 认证和 internal 认证时,可以通过 auth_password_format: plain|scram 选项指定以什么格式存储用户密码:

需要注意,当使用 SQL 认证方法,并且将 auth_password_format 设置为 SCRAM 格式时,数据库中存储的明文密码不自动地 SCRAM 化。为此,需要执行如下命令:

SQL 存储

ODBC 兼容的数据库也可用于为多个 ejabberd 模块存储信息。通过 Module Overview,查看哪些模块可以与关系数据库(如 MySQL)一起使用。为启用数据库存储,首先要确保数据库服务已经在运行,然后添加模块选项 db_type: sql,或者在全局设置 default_db: sql 选项。

配置默认数据库

可以通过 default_db 选项设置默认数据库:

default_db: mnesia|sql|riak:该选项用于为缺少 db_type 选项的模块指定默认数据库,或设置默认认证方法


会话管理[TOC]

默认情况下,C2S 会话信息被保存到 Mnesia 中。可以通过设置 sm_db_type: mnesia|sql|redis 选项,将 C2S 会话信息保存到其它数据库中。


mod_bosh

该模块实现 XMPP Over BOSH。BOSH 是 Bidirectional-streams Over Synchronous HTTP 的简称。BOSH 通过 HTTP 协议模拟 XMPP 需要的长连接。在实践中,当浏览器不支持 Websocket 或者请求必须通过 HTTP 代理时,可以通过 BOSH 使用 XMPP。

开启 BOSH 支持

mod_bosh 使用可配置的资源(将在该资源上提供BOSH 服务)扩展 ejabberd 的内置 HTTP 服务。

为使用 XMPP Over BOSH,需要启用 mod_bosh 模块:

并且在 HTTP 监听服务中添加 mod_boshmod_bosh 需要与 ejabberd_c2s 一起使用。比如:

当使用上面的配置时,该模块将为被发送到 http://example.org:5280/bosh/ 的请求服务。

请记住,mod_bosh 不是被网页浏览器使用的,它是被支持 XMPP over BOSH 的 XMPP 客户端使用的。

选项:

{max_inactivity, Seconds}:用于指定最大非活跃时间,单位是秒,默认值是 30 秒。比如,设置为 50 秒:

use_cache: false|true:按照 Caching 中的解释,使用该选项和相关的选项

发现:

需要正确地配置 DNS SRV 记录,以便客户端能发现为 XMPP 域提供服务的 BOSH 服务。请参考 XEP-0156

下面是用于 BOSH 的 DNS TXT 配置示例:


mod_ping

该模块实现对 XMPP Ping 和周期性地发送保活请求的支持。当启用该模块时,ejabber 按照协议中的定义,正确地响应 Ping 请求。

配置选项:

send_pings: true|false:如果该选项被设置为 true,那么服务端将向在给定的时间间隔(ping_interval)内非活跃的已连接客户端发送 Ping 请求。这有助于保持客户端连接活跃或检查可用性。默认情况下,该选项是关闭的

ping_interval: Seconds:多久向客户端发送一次 Ping 请求,注意,在开启 send_pings 选项的情况下,该选项才生效。如果某个客户端在该时间间隔内,未发送或接收任何节,那么服务端将向该客户端发送一个 Ping 请求。默认值是 60 秒

ping_ack_timeout:在确定客户端没有回应某个给定的服务端 Ping 请求之前,等待多久。默认值是 32 秒

timeout_action: none|kill:当客户端没在 ping_ack_timeout 时间内回应服务端 Ping 请求时,服务端要执行的操作。默认不做任何事情

下面的示例开启 Ping 响应、向 4 分钟内未活跃的客户端连接发送 Ping 请求、如果客户端没在 32 秒内响应 Ping,那么将关闭其连接:


mod_muc

该模块提供多用户聊天服务。用户可以发现已存在的房间,创建或加入房间。房间的成员可以发送公共消息,也可以发起私聊。

多用户聊天的一些特性如下:

MUC 服务允许任何 Jabber ID 注册昵称,这样其它任何人都不能在 MUC 服务里的任何房间中使用该昵称。为注册昵称,需要先在 XMPP 客户端中打开服务发现,然后在 MUC 服务中注册。

该模块支持集群和负载均衡。每个集群节点都能启动该模块。创建房间时,它们将被分散到所有可用的 MUC 模块实例上。多用户聊天模块是集群化的,但是房间本身不是集群化的,也不支持容错。如果正在管理一组房间的节点宕机,那么房间将消失,在第一次重连时,它们将在某个可用节点上被重新创建。

模块选项:

host: HostName:该选项用于指定服务的 Jabber ID。如果未指定 host 选项,那么 Jabber ID 是前缀 “conference.” 加上虚拟主机的名称。关键字 “@HOST@” 在启动时,将被替换成真正的虚拟主机名。

db_type: mnesia|sql|riak:用于指定存储类型。该模块将在指定的存储中创建表,以及存储用户信息。默认为通过全局选项 default_db 指定的存储,如果未设置 default_db 选项,那么默认为 mnesia。如果将该选项设置为 sqlriak,那么需要确保已经定义相应的数据库

access: AccessName:用于指定允许谁使用多用户聊天服务。默认情况下,允许所有人使用它

access_create: AccessName:用于指定允许谁在多用户聊天服务中创建新房间。默认情况下,允许所有本地账户创建房间

access_persistent: AccessName:用于配置允许谁修改 “persistent” 房间选项。默认情况下,允许所有本地账户修改该选项

access_mam: AccessName:用于配置允许谁修改 “mam” 房间选项。默认情况下,允许所有本地账户修改该选项

access_admin: AccessName:该选项用于指定允许谁管理多用户聊天服务。默认值是 none,这意味着只有房间的创建者可以管理他们的房间。管理员可以向服务的 JID 发送常规消息,这些消息将作为服务消息,在所有活跃房间中展示。管理员可以向活跃的房间的 JID 发送群消息,这些消息将作为服务消息,在房间中展示

access_register: AccessName:该选项用于指定允许谁在多用户聊天服务里注册昵称。默认值是 all,这意味着允许所有用户注册空闲的昵称

history_size: Size:当用户进入房间时,当前讨论的一小段历史将被发送给他们。可以通过该选项设置要保留,并且发送给加入房间的用户的历史消息的数量。其值是整型。将值设置为 0 将禁用历史消息特性,因此,内存中不保留任何消息。默认值是 20。该值是全局的,因此影响服务里的所有房间

max_users: Number:该选项用于在服务级别,指定每个房间允许的最大用户数量。可以在房间配置中降低该值,但是在单独的房间配置中,不能增加该值。默认值是 200

max_users_admin_threshold: Number:该选项用于指定当房间中的成员数量达到允许的最大数量时,允许进入该房间的服务管理员或房间所有者的数量。默认限制是 5

max_user_conferences: Number:该选项用于指定任意给定用户最多能加入多少个房间。默认值是 100。该选项用于防止可能发生的滥用。注意,这是软限制,在集群环境下,用户有时能加入到更多的会议

max_room_id: Number:该选项用于指定当创建新房间时,Room ID 最多可以有多少个字符。默认值是不限制 infinity

regexp_room_id: String:该选项用于指定 Room ID 必须满足的正则表达式。默认值是空字符串

max_room_name: Number:该选项用于指定在配置房间时,房间名称最多可以有多少个字符。默认值是不限制 infinity

max_room_desc: Number:该选项用于指定在配置房间时,房间描述最多可以有多少个字符。默认值是不限制 infinity

max_rooms_discoitems: Number:当房间数量超过该值时,在服务发现(Service Discovery)查询中,只返回非空房间。默认值是 100

min_message_interval: Number:该选项用于指定房间成员发送的两条消息之间的最小时间间隔,单位是秒。该选项是全局的,对所有房间都有效。该选项的值可以是小数。当未指定该选项时,消息的速率不受限制。该特性用于防止 MUC 服务被成员滥用,限制服务广播的消息数量。建议设置成 0.4 秒。如果某个成员尝试以更快的速度发送消息,那么将发回说明消息已被销毁,并且描述消息未被接受的原因的错误

min_presence_interval: Number:该选项用于指定来自房间成员的状态变更之间的最小时间间隔,单位是秒。该选项是全局的,对所有房间都有效。该选项的值可以是小数。当未指定该选项时,ejabberd 不应用任何限制。该选项用于防止 MUC 服务被成员滥用。如果某个成员尝试更频繁地改变其状态,那么状态信息将被 ejabberd 缓存,只有在间隔截止后,广播最后一个状态信息给房间里的所有成员。中间的 presence 数据包将被静默销毁。建议设置为 4 秒

max_users_presence: Number:该选项用于指定在房间中有多少个用户之后,该房间被认为过于拥挤。当 MUC 房间被认为拥挤时,状态广播将被限制,以减少负载、流量和状态“风暴”

default_room_options: {OptionName: OptionValue}:该选项允许指定期望的默认房间选项。注意,房间的创建者可以随时使用支持 MUC 功能的 XMPP 客户端修改其房间的选项。除 passwordtitle 房间选项的值是字符串、max_users 房间选项的值是整型外,所有其它房间选项的值可设置为 truefalse。可用的房间选项和默认值如下:

比如:

在下面的例子中,所有人都可以使用 MUC 服务,每个人都能创建新房间,但是只有用户 admin@example.org 能管理任何房间。在这个示例中,他也是全局管理员。当 admin@example.orgconference.example.org 发送一条像 “Tomorrow, the XMPP server will be moved to new hardware. This will involve service breakdowns around 23:00 UMT. We apologise for this inconvenience.” 之类的消息时,所有活跃房间都展示该消息。在这个示例中,禁用历史消息特性。


参考文档[TOC]


附录1:本地域名规则

翻译自:https://xmpp.org/rfcs/rfc6120.html#rules-local

如果 'to' 属性中的 JID 的域名部分匹配服务端配置的某个 FQDN,那么服务端必须先确定为该 FQDN 提供服务的是自己,还是某个专门的本地服务。如果是后者,那么服务端必须把节路由到该服务。如果是前者,那么服务端必须处理节,不能将其路由或向前投递到其它域,因为处理所有 'to' 地址的域名部分匹配服务端配置的某个 FQDN 的节是服务端的职责(另外,有助于防止循环)。


附录2:远程域名规则

翻译自:https://xmpp.org/rfcs/rfc6120.html#rules-remote

如果 'to' 属性中的 JID 的域名部分不匹配服务端配置的任何 FQDN,那么服务端应该尝试将其路由到远程域名。如下所述,存在两种可能的情形:

1,流已经存在

如果两个域名间的服务端-服务端流已经存在,那么发送者的服务端应该尝试通过已经存在的流,将节路由到支持远程域名的权威 XMPP 服务。

2,流不存在

如果两个域名间的服务端-服务端流不存在,那么发送者的服务端将按照以下步骤处理: