常用模块
附录
该文档是 ejabberd 配置的主入口点。ejabberd 非常强大,可以使用许多选项对它进行配置。但是,大多数情况下,只需要使用默认配置或对其进行少量修改,就已足够。
在以前的 ejabberd 版本中,配置文件需要使用 Erlang 语法书写。ejabberd 现在仍然支持这种格式,但是官方强烈推荐使用新的 YAML 格式的配置文件。下面将介绍 YAML 格式的配置文件。
ejabberd 在启动时,将加载配置文件。配置文件的扩展名必须是 .yml
或 .yaml
,这是因为ejabberd 根据扩展名,区分配置文件是 YAML格式的,还是遗留格式的。
在 YAML 中,不同的标量(scalar)将被当作不同的类型对待:
未被引用的或被单引号引用的字符串。在本文档中被称作 atom()
。比如 dog
、'Jupiter'
、'3.14159'
、YELLOW
数值字面值。这种类型被称作 integer()
、float()
或 number()
。比如 3
、-45.0
、.0
被双引号引用的或折叠的字符串。这种类型被称作 string()
。比如 "Lizzard"
、"orange"
、"3.14159"
。下面是折叠字符串的示例:
> Art thou not Romeo,
and a Montague?
| Neither, fair saint,
if either thee dislike.
对于关联数组(也叫映射)和列表,既可以使用多行缩进语法书写,也可以使用 JSON 风格的压缩语法书写。比如:
xxxxxxxxxx
param1"val1" "val2" param2"val3" "val4"
和
xxxxxxxxxx
param1
"val1"
"val2"
param2
"val3"
"val4"
等价。
注意,ejabberd 绝对不会编辑配置文件。因此,当通过 Web 管理接口修改配置参数时,应该手工地将这些修改应用到配置文件上。ejabberd 这样做是防止避免将配置文件弄乱。
ejabberd 将配置错误记录到 ejabberd.log
中。ejabberd 在其中记录语法相关的错误,以及关于未知选项的信息。
ejabberd 支持在单个实例上管理多个独立的 XMPP 域。这种特性叫“虚拟主机”(virtual hosting)。
hosts
选项用于指定 ejabberd 将要服务的域名列表。
语法是:
xxxxxxxxxx
HostName1 HostName2
比如:
只服务一个域
xxxxxxxxxx
hosts"example.org"
服务三个域
xxxxxxxxxx
hosts
"example.net"
"example.com"
"jabber.somesite.org"
当在单个实例上管理多个 XMPP 域时,这些域完全独立。这意味着,它们可以拥有不同的配置参数。
可以通过 host_config
选项,分别为每个虚拟主机指定参数。
语法是:
xxxxxxxxxx
HostName1 Option ...
比如:
example.net
使用 internal 认证方法,而 example.com
使用运行在 localhost 上的 LDAP 服务执行认证:
xxxxxxxxxx
host_config
"example.net"
auth_method internal
"example.com"
auth_method ldap
ldap_servers
"localhost"
ldap_uids
"uid"
ldap_rootdn"dc=localdomain"
ldap_rootdn"dc=example,dc=com"
ldap_password""
example.net
使用 sql 执行认证,而 example.com
使用运行在 localhost 和 otherhost 上的 LDAP 服务执行认证:
xxxxxxxxxx
host_config
"example.net"
auth_method sql
sql_type odbc
sql_server"DSN=ejabberd;UID=ejabberd;PWD=ejabberd"
"example.com"
auth_method ldap
ldap_servers
"localhost"
"otherhost"
ldap_uids
"uid"
ldap_rootdn"dc=localdomain"
ldap_rootdn"dc=example,dc=com"
ldap_password""
如果想要为某些虚拟主机指定其专有的模块,可以先在全局使用 modules
选项为所有虚拟主机指定公共模块,然后使用 append_host_config
选项,为特定虚拟主机添加其专有的模块。
下面示例定义三个虚拟主机,它们有若干个相同的模块,但是某些虚拟主机也有其专有的模块:
xxxxxxxxxx
hosts
"one.example.org"
"two.example.org"
"three.example.org"
modules
mod_roster
mod_configure
mod_disco
mod_private
mod_time
mod_last
mod_version
append_host_config
"one.example.org"
modules
mod_echo
host"echo-service.one.example.org"
mod_logxml
append_host_config
"two.example.org"
modules
mod_echo
host"mirror.two.example.org"
下面常用的 Logging 配置选项:
loglevel: Number
:
日志的详细程度,可用的日志级别如下:
0 - 不记录日志(不推荐)
1 - Critical
2 - Error
3 - Warning
4 - Info
5 - Debug
log_rotate: size, date and count
rotation 用于描述如何轮转日志(日志轮转的本质是旧日志文件的移动和新日志文件的创建)。文件大小和日期都能触发日志轮转。如果将 count 设置为 N,那么 ejabberd 将保留 N 个备份文件。将 count 设置为 0,不会关闭日志轮转,但是 ejabberd 不会保留备份日志文件。如果把 size 设置为 X,那么当日志文件增长到 X 个字节时,将轮转日志。如果想要关闭日志轮转,那么需要将 size 设置为 0,并且将 date 设置为空字符串("")。Date 的语法取自 newsyslog 在 newsyslog.conf 中使用的语法。
下面是一些示例:
$D0 - 每天 0 点
$D23 - 每天 23 点
$W0D23 - 每周日 23 点
$W5D16 - 每周五 16 点
$M1D0 - 每月 1 号 0 点
$M5D6 - 每月 5 号 6 点
log_rate_limit: Number
该选项用于过载保护。它用来限制 error_logger 记录日志的速率,这样可以避免在系统过载时,产生大量日志。默认值是 100
hide_sensitive_log_data: Boolean
当将该选项设置为 true 时,ejabberd 将不记录 IP 地址和敏感数据。默认值是 false
listen
选项用于指定 ejabberd 监听哪些端口、地址和网络协议,以及在它们上面运行哪些服务。该列表中的每个元素是一个关联数组,这些数组中包含下述元素:
端口号,以及可选的 IP 地址、传输层协议
为该端口提供服务的监听模块
用于 TCP Socket 和监听模块的选项
语法是:
xxxxxxxxxx
Listener ...
比如:
xxxxxxxxxx
listen
-
port5222
module ejabberd_c2s
starttlstrue
-
port5269
module ejabberd_s2s_in
transport tcp
端口号用于指定在哪个端口上接收进入的连接。它既可以是 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:access
、ciphers
、dhfile
、protocol_options
、max_fsm_queue
、max_stanza_size
、shaper
、starttls
、starttls_required
、tls
、zlib
、tls_compression
ejabberd_s2s_in
:处理进入的 s2s 连接
Options:max_stanza_size
、shaper
、tls_compression
ejabberd_service
:与外部组件进行交互
Options:access
、hosts
、max_fsm_queue
、password
、check_from
、shaper_rule
ejabberd_sip
:处理 SIP 请求
Options:certfile
、tls
ejabberd_stun
:处理 STUN/TURN 请求
Options:certfile
、tls
、use_turn
、turn_ip
、turn_port_range
、turn_max_allocations
、turn_max_permissions
、shaper
、server_name
、auth_realm
、auth_type
ejabberd_http
:处理进入的 HTTP 连接。通过正确配置 request_handlers
选项,该模块可以提供 Web 管理、XMPP BOSH 和 Websocket 等服务
Options:captcha
、default_host
、dhfile
、request_handlers
、tls
、tls_compression
、trusted_proxies
(global option)、web_admin
ejabberd_xmlrpc
:处理 XML-RPC 请求,执行 ejabberd 命令
Options:access_commands
、maxsessions
、timeout
下面详细介绍监听模块支持的选项:
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_service
和 ejabberd_c2s
监听模块指定该选项,也可以在全局为 ejabberd_s2s_out
监听模块指定该选项。如果没有为 ejabberd_service
和 ejabberd_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 提供服务:
xxxxxxxxxx
request_handlers
"/a/b" mod_foo
"/bosh" mod_bosh
"/mqtt" mod_mqtt
check_from: true|false
:This option can be used with ejabberd_service
only. XEP-0114
requires 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
选项启用。如果设置该选项,那么也应该设置 certfiles
或 certfile
选项。也可以在 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.txt 或 https://www.jianshu.com/p/cc8d592582c9。该选项的默认值是 false
zlib: true|false
:该选项用于指定在连接上,使用 zlib 流压缩
在 ejabberd 配置文件中,可以指定一些全局选项:
certfiles: List of paths
:该选项接受包含 PEM 证书或 PEM 私钥的文件路径(可以包含通配符)的列表。在启动时,ejabberd 对证书进行排序,找到匹配的私钥,重建完整的证书链。当在 ejabberd_c2s
、ejabberd_s2s
或 ejabberd_http
中使用 starttls
或 tls
之类的选项时,使用该选项
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 中的安全规则信任
下面的示例中:
有三个域。默认证书文件是 server.pem
。而到 example.com
域的 c2s 和 s2s 连接使用文件 example_com.pem
5222 端口使用 STARTTLS 监听 c2s 连接,并且允许旧客户端使用的明文连接
5223 端口使用旧 SSL 监听 c2s 连接
5269 端口使用 STARTTLS 监听 s2s 连接。socket 被设置为 IPv6,而不是 IPv4
3478 端口通过 UDP 监听 STUN 请求
5280 端口监听 HTTP 请求,并且提供 HTTP-Bind(Bosh)服务
5281 端口监听 HTTP 请求,使用 HTTPS 提供 HTTP-Bind(Bosh)和 Web 管理服务(参考 Managing: Web Admin),socket 只监听到 IP 地址 127.0.0.1
的连接
xxxxxxxxxx
hosts
"example.com"
"example.org"
"example.net"
certfiles
"/etc/ejabberd/server.pem"
"/etc/ejabberd/example_com.pem"
listen
-
port5222
module ejabberd_c2s
access c2s
shaper c2s_shaper
starttlstrue
max_stanza_size65536
-
port5223
module ejabberd_c2s
access c2s
shaper c2s_shaper
tlstrue
max_stanza_size65536
-
port5269
ip"::"
module ejabberd_s2s_in
shaper s2s_shaper
max_stanza_size131072
-
port3478
transport udp
module ejabberd_stun
-
port5280
module ejabberd_http
http_bindtrue
-
port5281
ip"127.0.0.1"
module ejabberd_http
web_admintrue
http_bindtrue
tlstrue
s2s_use_starttls optional
outgoing_s2s_families
ipv4
ipv6
outgoing_s2s_timeout10000
trusted_proxies"127.0.0.1" "192.168.1.11"
auth_method
选项用于指定用于用户认证的认证方法。语法是:
xxxxxxxxxx
Method ...
ejabberd 支持下列认证方法:
当忽略该选项时,ejabberd 将根据通过 default_db
选项配置的默认数据库,决定使用哪种认证方法。如果 default_db
选项也未被设置,那么默认的认证方法是 internal
。
只有 internal、external 和 sql 方法支持创建账户。
resource_conflict
选项用于指定,当客户端尝试使用已经连接的资源登陆账户时,服务端执行的行为。语法是:
xxxxxxxxxx
resource_conflict setresource|closenew|closeold
该选项的三个可选值对应 XMPP Core: section 7.7.2.2 中描述的三种可能性。默认值是 closeold
。
其中:
setresource
:表示使用服务端生成的 resourcepart 重写正在连接的客户端提供的 resourcepart
closenew
:表示不允许正在连接的客户端的资源绑定企图,维持当前已连接的客户端会话
closeold
:表示终止当前已连接的客户端的会话,允许正在连接的客户端的资源绑定企图
本文只介绍 external 认证方式,关于其它认证方式,请自行查阅官方文档。
如果使用这种认证方法,ejabberd 在启动时,将启动一个脚本,然后调用它们执行认证任务。
开发人员可以使用任何语言编写外部认证脚本。ejabbed Developers Guide 描述 ejabberd 和脚本之间的接口细节。
在使用 external 认证方式时,需要配置下述选项:
extauth_program: PathToScript
外部认证脚本的完整路径。该脚本必须能被 ejabberd 执行
extauth_instances: Integer
在虚拟主机中,并发地运行多少个脚本实例,提供认证服务。默认值是 1
auth_use_cache: false|true
从 ejabberd 17.06 开始,缓存已被彻底改造。现在使用一组新变量,代替 ext_auth_cache
,描述缓存行为,并且默认值是 true。注意,当为每个用户维护多个密码时,缓存将产生干扰。因此,当认证机制支持应用程序特有的(application-specific)密码时,必须关闭缓存。与缓存有关的选项是 auth_use_cache
,auth_cache_missed
,auth_cache_size
,auth_cache_life_time
。更多关于缓存的细节,请参考 Caching
下面的示例设置外部认证方法,外部认证脚本,关闭缓存,并且为每个虚拟主机启动 3 个脚本实例:
xxxxxxxxxx
auth_method external
extauth_program"/etc/ejabberd/JabberAuth.class.php"
extauth_instances3
auth_use_cachefalse
本章节介绍在 ejabberd 16.06 中引入的新 ACL 语法。如果想要了解以前的访问规则和 ACL 语法,请参考 configuration document archive。
在 ejabberd 中,访问控制通过访问控制列表(ACL)来执行。定义 ACL 的语法如下所示:
xxxxxxxxxx
acl ACLName ACLType ACLValue
ACLType: ACLValue
的取值如下:
all
:匹配任意 JID。比如:
xxxxxxxxxx
acl
world all
user: UserName
:匹配任意本地虚拟主机上的、名称为 UserName 的用户。比如:
xxxxxxxxxx
acl
admin
user"yozhik"
user: {Username: Server} | Jid
:匹配任意 JID 的 localpart 是 UserName、domainpart 是 Server、resourcepart 是任意值的用户。比如:
xxxxxxxxxx
acl
admin
user
"yozhik""example.org"
user"peter@example.org"
server: Server
:匹配任意 JID 的 domainpart 是 Server 的用户。比如:
xxxxxxxxxx
acl
exampleorg
server"example.org"
resource: Resource
:匹配任意 JID 的 resourcepart 是 Resource 的用户。比如:
xxxxxxxxxx
acl
mucklres
resource"muckl"
shared_group: Groupname
:Matches any member of a Shared Roster Group with name Groupname in the virtual host. Example:
xxxxxxxxxx
acl
techgroupmembers
shared_group"techteam"
shared_group: {Groupname: Server}
:Matches any member of a Shared Roster Group with name Groupname in the virtual host Server. Example:
xxxxxxxxxx
acl
techgroupmembers
shared_group
"techteam""example.org"
ip: Network
:匹配任意属于网段 Network 的 IP 地址,比如:
xxxxxxxxxx
acl
loopback
ip
"127.0.0.0/8"
"::1"
user_regexp: Regexp
:匹配任意本地虚拟主机上的、名称匹配 Regexp 的本地用户。比如:
xxxxxxxxxx
acl
tests
user_regexp"^test[0-9]*$"
user_regexp: {Regexp: Server} | JidRegexp
:匹配任意 Server 上的、名称匹配 Regexp 的用户。比如:
xxxxxxxxxx
acl
tests
user_regexp
"^test1": "example.org"
"^test2@example.org"
server_regexp: Regexp
:匹配任意 domainpart 匹配 Regexp 的 JID:
xxxxxxxxxx
acl
icq
server_regexp"^icq\\."
resource_regexp: Regexp
:匹配任意 resourcepart 匹配 Regexp 的 JID:
xxxxxxxxxx
acl
icq
resource_regexp"^laptop\\."
node_regexp: {UserRegexp: ServerRegexp}
:匹配任意 localpart 匹配 UserRegexp,并且 domainpart 匹配 ServerRegexp 的 JID。比如:
xxxxxxxxxx
acl
yozhik
node_regexp
"^yozhik$""^example.(com|org)$"
user_glob: Glob
:
user_glob: {Glob: Server}
:
server_glob: Glob
:
resource_glob: Glob
:
node_glob: {UserGlob: ServerGlob}
:
与上面的 *_regexp
类似。不同的是,这里使用的是 shell glob 模式,而不是正则表达式。在 glob 模式中,可以使用如下元字符:
*:匹配任意字符串,包括空字符串
?:匹配任意单个字符
[...]:匹配方括号内的任意字符。字符范围用被中划线("-")分隔的一对字符表示,比如 a-z、0-9。如果方括号内的第一个字符是 "!",那么该模式匹配不在方括号内的任意字符
下面的 ACLName 是预定义的:
all
:匹配任意 JID
none
:不匹配任何 JID
access_rules
中定义的访问规则用于允许或禁止对不同服务的访问。语法是:
xxxxxxxxxx
access_rules AccessName - allow|deny ACLRule|ACLDefinition
访问规则的定义中可以包含任意数量的 - allow
和 - deny
区域。每个区域可以包含任意数量的 ACL 规则(acl: RuleName
在名称为 RuleName 的 ACL 规则匹配时匹配)。如果未指定 ACL 规则或 ACL 规则未被定义,那么使用规则 all
。
ejabberd 按照从上到下的顺序处理定义中的 - allow
和 - deny
区域。当某个区域列出的所有 ACL 规则都匹配时,则把它作为访问规则的结果。否则,访问规则的结果是 deny
。
为简化配置,- allow: acl
可以简写为 - allow
,- deny: acl
可以简写为 - deny
。在下面的例子中,短版本定义和长版本定义是等价的:
xxxxxxxxxx
access_rules
a_short admin
a_long
acl admin
b_short
deny banned
allow
b_long
deny
acl banned
allow
all
值得注意的是,在全局定义的访问权限的优先级高于在虚拟主机中定义的访问权限的优先级。这意味着,在发生冲突的情况下,将使用在全局定义的授予或禁止权限,而在虚拟主机中定义的权限不生效。
比如:
xxxxxxxxxx
access_rules
configure
allow admin
something
deny someone
allow
s2s_banned
deny problematic_hosts
deny
acl banned_forever
deny
ip"222.111.222.111/32"
deny
ip"111.222.111.222/32"
allow
xmlrpc_access
allow
user"peter@example.com"
allow
user"ivone@example.com"
allow
user"bot@example.com"
ip"10.0.0.0/24"
下面的 AccessName 是预定义的:
all
:始终返回 allow
none
:始终返回 deny
shaper 用于限制连接上的流量(connection traffic)。语法是:
xxxxxxxxxx
shaper ShaperName Rate
其中,Rate
代表 ejabberd 允许的最大传入速率(单位是字节/秒)。当达到该限制时,ejabberd 将停止从 socket 上读取数据,直到平均速率再次低于允许的最大速率。
比如:
定义一个叫 normal 的 shaper,它用于将传输速度限制到 1,000 字节/秒:
xxxxxxxxxx
shaper
normal1000
定义一个叫 fas t的 shaper,它用于将传输速度限制到 50,000 字节/秒:
xxxxxxxxxx
shaper
fast50000
shaper_rules
用于为用户或主机声明要使用的 shaper。语法是:
xxxxxxxxxx
shaper_rules ShaperRuleName - Number|ShaperName ACLRule|ACLDefinition
语义与访问权限中的描述相似。唯一的区别是,在访问权限中使用的是 - allow
和 - deny
;在 shaper_rules
中使用的是 shaper 的名称或数字。
比如:
xxxxxxxxxx
shaper_rules
connections_limit
10
user"peter@example.com"
100 admin
5
download_speed
fast admin
slow anonymous_users
normal
log_days30
max_user_sessions
用于指定每个用户的最大会话数量。如果用户尝试使用不同的资源打开更多会话,那么 ejabberd 将断开第一个会话。错误 session replaced
将被发送给被断开的会话。该选项的值既可以是数值,也可以是 infinity
。默认值是 infinity
。
语法是:
xxxxxxxxxx
max_user_sessions - Number ACLRule|ACLDefinition
在下面的例子中,admin 的最大会话数量被限制为 10,其它用户的最大会话数量被限制为 5:
xxxxxxxxxx
shaper_rules
max_user_sessions
10 admin
5
max_s2s_connections
用于指定,对于某个特定远程 XMPP 服务,ejabberd 能建立多少个并发的 s2s 连接。默认值是 1。
语法是:
xxxxxxxxxx
max_s2s_connections ACLName MaxNumber
比如:
对于每个远程服务,允许建立 3 个连接
xxxxxxxxxx
shaper_rules
max_s2s_connections3
默认情况下,ejabberd 使用其内部的 mnesia 数据库。但 ejabberd 也可以使用关系型数据库、key-value 存储或 LDAP 服务存储持久的、生命周期较长的数据。ejabberd 非常灵活,可以为不同的虚拟主机配置不同的认证方法;可以为同一个虚拟主机配置不同的认证机制(fallback);可以为不同的模块设置不同的存储系统等。
ejabberd 支持下列数据库:
需要注意,如果在 ejabberd.yml 中指定多个域名,并且为了用户名不会在不同的虚拟主机之间发生冲突和混淆,需要每个虚拟主机使用不同的数据库、认证和存储配置。此时,必须在 host_config
内,为每个虚拟主机设置接下来要介绍的选项。比如:
xxxxxxxxxx
host_config
"public.example.org"
sql_type pgsql
sql_server"localhost"
sql_database"database-public-example-org"
sql_username"ejabberd"
sql_password"password"
auth_method sql
ejabberd 支持两种数据库模式。当使用默认的遗留模式时,一个数据库只能处理一个 XMPP 域名。新模式允许在单个数据库中,处理多个 XMPP 域名。当 ejabberd 实例为多个域名提供服务,或者偶尔改变域名时,使用新模式是最好的。因为这样可以避免管理多个数据库,以及处理复杂的配置变更。
当使用关系型数据库存储数据时,需要根据数据库类型和使用的模式(遗留模式或新模式),从这个列表中选择合适的 SQL 文件,并且把其中定义的模式上传到 SQL 服务。比如当使用 MySQL,并且选择默认模式时,应该选择 mysql.sql;当使用 PostgresSQL,并且选择新模式时,应该选择 pg.new.sql。
当选择新模式时,必须向 ejabberd.yml
配置文件中添加下述配置:
xxxxxxxxxx
new_sql_schematrue
真正的数据库访问通过带有 sql_
前缀的选项指定:
sql_type: mysql | pgsql | odbc | mssql | sqlite
:SQL 连接的类型,默认值是 odbc
sql_server: String
:SQL 服务的主机名,默认值是 localhost
sql_port: Port
:SQL 服务接收连接的端口。该选项可用于 mysql
、pgsql
和 mssql
,默认值分别是 3306
和 5432
sql_database: String
:数据库名,默认值是 ejabberd
。该选项可用于 mysql
、pgsql
和 mssql
sql_username: String
:用户名,默认值是 ejabberd
。该选项可用于 mysql
、pgsql
和 mssql
sql_password
:密码,默认值是空字符串。该选项可用于 mysql
、pgsql
和 mssql
sql_ssl: Boolean
:使用 SSL,默认值是 false
。该选项可用于 pgsql
sql_ssl_verify: Boolean
:设置是否验证 SSL 连接。默认值是 false
。该选项可用于 pgsql
sql_ssl_cafile: String
:CA 认证文件的路径。默认情况下,不设置该选项。该选项可用于 pgsql
sql_ssl_certfile: String
:The path to a client/authentication certificate file. By default the option is not set. The option is valid for pgsql
sql_pool_size: N
:默认情况下,ejabberd 为每个虚拟主机打开 10 个数据库连接。可以使用该选项改变这个值
sql_keepalive_interval: N
:该选项用于配置发送(使数据库连接保持活跃的)保活请求(“假” SQL 请求)的时间间隔。默认值是 "undefined",因此不发送保活请求。单位是秒,比如 28800 意味着 8 小时
sql_start_interval: N
:当数据库连接失败时,ejabberd 在重试之前等待 30 秒。可以通过这个选项修改该时间间隔
下面是明文 ODBC 连接的示例:
xxxxxxxxxx
sql_server"DSN=database;UID=ejabberd;PWD=password"
下面是 MySQL 连接的示例:
xxxxxxxxxx
sql_type mysql
sql_server"server.company.com"
sql_port 3306 # the default
sql_database"mydb"
sql_username"user1"
sql_password"**********"
sql_pool_size5
ejabberd 可以使用 SQL 数据库认证用户。请参考认证中的 auth_method
选项。
在使用 SQL 认证和 internal 认证时,可以通过 auth_password_format: plain|scram
选项指定以什么格式存储用户密码:
plain
:密码以明文形式存储到数据库中。该格式是默认值。这种格式允许客户端使用旧Jabber Non-SASL (XEP-0078
), SASL PLAIN
,SASL DIGEST-MD5
和 SASL SCRAM-SHA-1
,进行认证
scram
:ejabberd 不存储密码,只存储一些用于校验客户端提供的哈希值的信息。从存储信息中无法获取到原始的明文密码。因此,当 auth_password_format
被配置为该值后,无法再改回 plain
。这种格式允许客户端使用 SASL PLAIN
和 SASL SCRAM-SHA-1
,进行认证
需要注意,当使用 SQL 认证方法,并且将 auth_password_format
设置为 SCRAM 格式时,数据库中存储的明文密码不自动地 SCRAM 化。为此,需要执行如下命令:
xxxxxxxxxx
ejabberdctl convert_to_scram example.org
ODBC 兼容的数据库也可用于为多个 ejabberd 模块存储信息。通过 Module Overview,查看哪些模块可以与关系数据库(如 MySQL)一起使用。为启用数据库存储,首先要确保数据库服务已经在运行,然后添加模块选项 db_type: sql
,或者在全局设置 default_db: sql
选项。
可以通过 default_db
选项设置默认数据库:
default_db: mnesia|sql|riak
:该选项用于为缺少 db_type
选项的模块指定默认数据库,或设置默认认证方法
默认情况下,C2S 会话信息被保存到 Mnesia 中。可以通过设置 sm_db_type: mnesia|sql|redis
选项,将 C2S 会话信息保存到其它数据库中。
该模块实现 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
模块:
xxxxxxxxxx
modules
...
mod_bosh
...
并且在 HTTP 监听服务中添加 mod_bosh
,mod_bosh
需要与 ejabberd_c2s
一起使用。比如:
xxxxxxxxxx
listen
-
port5222
module ejabberd_c2s
max_stanza_size65536
shaper c2s_shaper
access c2s
...
-
port5280
module ejabberd_http
request_handlers
"/bosh" mod_bosh
web_admintrue
...
当使用上面的配置时,该模块将为被发送到 http://example.org:5280/bosh/
的请求服务。
请记住,mod_bosh
不是被网页浏览器使用的,它是被支持 XMPP over BOSH 的 XMPP 客户端使用的。
选项:
{max_inactivity, Seconds}
:用于指定最大非活跃时间,单位是秒,默认值是 30 秒。比如,设置为 50 秒:
xxxxxxxxxx
modules
...
mod_bosh
max_inactivity50
...
use_cache: false|true
:按照 Caching 中的解释,使用该选项和相关的选项
发现:
需要正确地配置 DNS SRV 记录,以便客户端能发现为 XMPP 域提供服务的 BOSH 服务。请参考 XEP-0156。
下面是用于 BOSH 的 DNS TXT 配置示例:
xxxxxxxxxx
_xmppconnect IN TXT "[ _xmpp-client-xbosh=https://web.example.org:5280/bosh ]"
该模块实现对 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,那么将关闭其连接:
xxxxxxxxxx
modules
...
mod_ping
send_pingstrue
ping_interval240
timeout_action kill
...
该模块提供多用户聊天服务。用户可以发现已存在的房间,创建或加入房间。房间的成员可以发送公共消息,也可以发起私聊。
多用户聊天的一些特性如下:
向房间成员发送公共或私有消息
邀请其它用户进入房间
设置房间主题
创建密码,保护房间
驱逐或拒绝成员
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
。如果将该选项设置为 sql
或 riak
,那么需要确保已经定义相应的数据库
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 客户端修改其房间的选项。除 password
和 title
房间选项的值是字符串、max_users
房间选项的值是整型外,所有其它房间选项的值可设置为 true
或 false
。可用的房间选项和默认值如下:
allow_change_subj: true|false
:允许成员改变主题
allow_private_messages: true|false
:成员可以向其它成员发送私有消息
allow_private_messages_from_visitors: anyone|moderators|nobody
:访客可以向其它成员发送私有消息
allow_query_users: true|false
:成员可以向其他成员发送 IQ 查询
allow_subscription: true|false
:允许房间成员订阅房间事件。参考 Multi-User Chat Subscriptions
allow_user_invites: false|true
:允许成员发送邀请
allow_visitor_nickchange: true|false
:允许访客改变昵称
allow_visitor_status: true|false
:允许访客在状态更新中发送 status
文本。如果禁用该选项,那么在将状态更新广播给所有房间成员之前,将除掉 status
文本
anonymous: true|false
:房间是匿名的,房间的成员无法看到其他成员的真实 JID。注意,房间主持人始终可以看到成员的真实 JID
captcha_protected: false|true
:当用户尝试加入与之没有隶属关系的房间时,房间要求其填写验证码(参考 CAPTCHA),以便接受他们的加入
lang: Language
:用于房间里的讨论的首选语言。语言的格式应该遵守 RFC 5646
logging: false|true
:使用 mod_muc_log
记录公共消息
mam: false|true
:开启消息归档。意味着将启用 mod_mam
max_users: Number
:房间里的最大成员数量,默认值是 200
members_by_default: true|false
:默认情况下,进入房间的成员是参与者。因此允许他们“发声”
members_only: false|true
:只有房间的成员能进入
moderated: true|false
:只有可以“发声”的成员能发送公共消息
password: roompass123
:房间的密码。只有开启 password_protected
选项时,该选项才生效
password_protected: false|true
:进入房间需要密码
persistent: false|true
:即使最后一个参与者离开,房间仍然存在
presence_broadcast: [moderator, participant, visitor]
:状态信息将被广播给该列表中的角色。该列表可以包含 moderator、participant、visitor 中的一个或多个
public: true|false
:在 MUC 服务的列表中,房间是公共的,因此可以发现它。在服务发现中,MUC 管理员和房间成员能够看到私有的房间,房间名称将带有单词 “private”
public_list: true|false
:参与者的列表是公开的。无需进入房间,即可获取该列表
title: Room Title
:可读的房间标题
比如:
在下面的例子中,所有人都可以使用 MUC 服务,每个人都能创建新房间,但是只有用户 admin@example.org
能管理任何房间。在这个示例中,他也是全局管理员。当 admin@example.org
向 conference.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.” 之类的消息时,所有活跃房间都展示该消息。在这个示例中,禁用历史消息特性。
xxxxxxxxxx
acl
admin
user
"admin": "example.org"
access_rules
muc_admin
allow admin
modules
...
mod_muc
access all
access_create all
access_admin muc_admin
history_size0
...
翻译自:https://xmpp.org/rfcs/rfc6120.html#rules-local
如果 'to' 属性中的 JID 的域名部分匹配服务端配置的某个 FQDN,那么服务端必须先确定为该 FQDN 提供服务的是自己,还是某个专门的本地服务。如果是后者,那么服务端必须把节路由到该服务。如果是前者,那么服务端必须处理节,不能将其路由或向前投递到其它域,因为处理所有 'to' 地址的域名部分匹配服务端配置的某个 FQDN 的节是服务端的职责(另外,有助于防止循环)。
翻译自:https://xmpp.org/rfcs/rfc6120.html#rules-remote
如果 'to' 属性中的 JID 的域名部分不匹配服务端配置的任何 FQDN,那么服务端应该尝试将其路由到远程域名。如下所述,存在两种可能的情形:
1,流已经存在
如果两个域名间的服务端-服务端流已经存在,那么发送者的服务端应该尝试通过已经存在的流,将节路由到支持远程域名的权威 XMPP 服务。
2,流不存在
如果两个域名间的服务端-服务端流不存在,那么发送者的服务端将按照以下步骤处理:
解析远程域名的 FQDN
协商建立两个域名之间的服务端-服务端流
通过新建立的流将节路由到支持远程域名的权威 XMPP 服务