一、基本配置
配置文件将在你第一次启动ejabberd时加载,从该文件中获得的内容将被解析并存储到内部的ejabberd数据库中,以后的配置将从数据库加载,并且任何配置文件里的命令都会被添加到数据库里。
需要注意的是:ejabberd从不编辑配置文件,因此,使用Web管理修改的配置被存储在数据库中, 而不是反射到配置文件。如果你想那些修改在ejabberd重启后还有效,你可以同时也修改配置文件或删除它的所有内容。
配置文件包含一系列Erlang条款。以‘%’标志开始的行被忽略。每个条款是一个元组,其第一个元素是一个选项的名称,任何更多的元素则是该选项的值。如果配置文件不包含类似‘hosts’选项,则旧的存储在数据库的主机名(s)将被启用。
通过在配置文件的开始部分增加下面几行,可以重写存储在数据库中的值:
override_global.
override_local.
override_acls.
有了这些行,旧的全局选项(在一个集群内所有ejabberd节点之间共享的选项), 本地选项(个别ejabberd节点特有的选项) 以及 ACLs(Access Control Lists)将在新配置添加之前被移除。
1、主机名
选项hosts定义了包含一个或多个域名的列表,ejabberd将为这些域名提供服务。
语法是:
{hosts, [HostName, …]}.
示例:
(1)服务一个域:
(2)服务多个域:
2、虚拟主机
每个虚拟主机的选项可以被独立定义,使用host_config选项。
语法是:
{host_config, HostName, [Option, …]}
示例:
(1)域example.net使用内部验证方法,而域example.com使用运行在域localhost的LDAP服务器来进行验证:
(2)域example.net使用ODBC来进行验证,而域example.com使用运行在域localhost和otherhost的LDAP服务器:
为了给一个虚拟主机指定特定的ejabberd模块,你可能先为常规模块定义全局模块选项,之后增加指定的模块给特定的虚拟主机. 为此, 把定义host_config的每个选项改成通用语法:
{OptionName, OptionValue}
使用这个语法:
{{add, OptionName}, OptionValue}
在这个例子里,三个虚拟主机有一些相同的模块,但是特定的虚拟主机也有不同的模块:
%% 这个ejabberd服务器有三个虚拟主机:
%% 这些是所有主机通用模块的配置
%% 增加一些模块给 vhost one:
%% 只增加一个模块给 vhost two:
3、监听端口号
选项listen定义ejabberd将监听哪些端口、地址和网络协议,以及什么服务将运行在它们上面。这个列表的每个元素都是一个元组包括以下的元素:
(A)端口号,还有可选的IP地址和/或一个传输协议。
(B)监听这个端口的模块。
(C)TCP socket和监听模块的选项。
这个选项的语法是:
{listen, [Listener, …]}.
定义一个listener有很多语法:
{PortNumber, Module, [Option, …]}
{{PortNumber, IPaddress}, Module, [Option, …]}
{{PortNumber, TransportProtocol}, Module, [Option, …]}
{{PortNumber, IPaddress, TransportProtocol}, Module, [Option, …]}
(1)端口号、IP地址和传输协议
端口号定义哪个端口监听链入的连接,它可能是一个Jabber/XMPP标准端口(5222)或任何其它合法的端口号。
IP地址可能被表达为一个字符串或一个十进制或十六进制的Erlang元组。socket将只监听那个网络接口。也可能指定一个通用地址, 这样ejabberd将监听所有地址。取决于IP地址的类型(将使用IPv4或IPv6)。当没有指定IP地址时,它将监听所有IPv4网络地址。
一些IP地址的示例值:
(A)”0.0.0.0″:监听所有IPv4网络接口. 这是当没有指定IP地址时的缺省值。
(B)”::” :监听所有IPv6网络接口。
(C)”10.11.12.13″:监听IPv4地址10.11.12.13。
(D)”::FFFF:127.0.0.1″:是IPv6地址::FFFF:127.0.0.1/128。
(E){10, 11, 12, 13}:是IPv4地址10.11.12.13。
(F){0, 0, 0, 0, 0, 65535, 32512, 1}:是IPv6地址 ::FFFF:127.0.0.1/128。
(G){16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1}:是IPv6地址 FDCA:8AB6:A243:75EF::1/128。
传输协议可能是tcp或udp,缺省是tcp。
(2)监听模块
可用的模块,它们的目的以及允许使用哪些选项:
ejabberd_c2s
处理c2s连接. 选项: access, certfile, max_fsm_queue, max_stanza_size, shaper, starttls, starttls_required, tls, zlib
ejabberd_s2s_in
处理链入的s2s连接. 选项: max_stanza_size
ejabberd_service
和一个交互(定义于Jabber组件协议(). 选项: access, hosts, max_fsm_queue, shaper, service_check_from
ejabberd_stun
处理STUN绑定请求,定义于 . 选项: certfile
ejabberd_http
处理链入的HTTP连接.
选项: captcha, certfile, http_bind, http_poll, request_handlers, tls, web_admin
(3)选项
这是监听模块允许使用选项的详细描述:
{access, AccessName}
这个选项定义访问的端口,缺省值是all。
{backlog, Value}
这个backlog值定义等待中的连接的队列可以达到的最大长度,如果服务器想处理很多新链入的连接,这个值需要增加。因为如果队列里没有足够的空间(ejabberd不能立刻接受它们),这些新连接可能被抛弃,缺省值是5。
{certfile, Path}
包含缺省的SSL证书的文件的完整路径,为一个给定的域定义一个证书文件,使用全局选项domain_certfile。
{service_check_from, true|false}
这个选项只能被用于ejabberd_service,它被用于禁止控制一个从外部组件发送的包的from字段。这个选项要么是true要么是false。缺省值是true,它遵循。
{hosts, [Hostname, …], [HostOption, …]}
连接到ejabberd_service的外部Jabber组件可能服务一个或多个hostnames。所以你可以为这个组件定义选项HostOption;目前允许的选项是当组件尝试连接到ejabberd时必需提供的密码:{password, Secret}。注意你不能在不同的服务里定义同一个ejabberd_service组件:为每个服务增加一个ejabberd_service。
captcha
简单的web页面,允许一个用户填一个CAPTCHA。
http_bind
这个选项允许支持HTTP绑定(和)。HTTP绑定允许通过HTTP请求,从那些不允许从5222端口链出socket的防火墙后面访问ejabberd. 记住你也必须安装和激活mod_http_bind模块。 如果HTTP绑定激活了, 它将可以使用.注意对HTTP绑定的支持也需要XMPP客户端,也要注意HTTP绑定对一个基于web的XMPP客户端的主机也是很有意义的,例如(根据教程为ejabberd安装JWChat,以及一个或)。
http_poll
这个选项允许支持HTTP轮询(). HTTP轮询允许通过HTTP请求,从那些不允许从5222端口链出socket的防火墙后面访问ejabberd.
如果激活了HTTP轮询, 它可以用 . 注意对HTTP轮询的支持也需要XMPP客户端. 也要注意HTTP轮询对一个基于web的XMPP客户端的主机是很有意义的,例如. 在没有链入的POST请求时一个客户端会话保持激活状态的最大时间段,可以用全局选项 http_poll_timeout 配置. 缺省值为5分钟. 这个选项可在ejabberd.cfg文件里定义, 时间的单位为秒:{http_poll_timeout, 300}.
{max_fsm_queue, Size}
这个选项指定在一个FSM(有限状态机)队列里元素的最大数量。大概来说,这些队列的每个消息展示一个准备发送到的外发流的XML stanza。如果队列大小达到限制(例如:由于stanzas的接收者太慢),这个FSM和相应的连接(如果有)将被终止并且记录一个出错信息。这个选项的合理值依赖于你的硬件配置。然而, 把这个大小设为1000个元素以上没有什么意义。这个选项可被指定给ejabberd_service和 ejabberd_c2s listeners,或也可以全局地指定给ejabberd_s2s_out。如果这个选项没有指定给ejabberd_service或 ejabberd_c2s listeners, 则使用全局配置的值. 允许的值为整数和 ’undefined’. 缺省值为: ’undefined’.
{max_stanza_size, Size}
这个选项指定一个XML stanzas的近似最大字节数。近似的,是因为它计算的精度是以一个被读数据块来的,例如{max_stanza_size, 65536},缺省值是无穷大,推荐值对于c2s连接是65536,对于s2s连接是131072。s2s最大节数必须总是比c2s的限制更高,谨慎修改此值,因为如果设置得太小可能导致意料之外的断开连接。
{request_handlers, [ {Path, Module}, …]}
指定一个或多个handlers来伺服HTTP请求。Path是一个字符串列表,所以以那个Path启动的URIs将被Module伺服,例如:如果你想mod_foo伺服以/a/b/开头的URIs,同时你也想mod_http_bind伺服URIs /http-bind/,则使用这个选项:{request_handlers, [{[“a”, “b”], mod_foo}, {[“http-bind”], mod_http_bind}]}
{service_check_from, true|false}
这个选项只能被ejabberd_service使用。要求域必须和组件的主机名匹配。如果选项设置为false,ejabberd将允许组件发送’from’属性中的任意域的stanzas。只有你完全确认自己需要的情况下才应该激活这个选项。为了兼容,缺省值是:true.
{shaper, none|ShaperName}
这个选项为端口定义一个shaper,缺省值是 none.
starttls
这个选项定义STARTTLS加密可以用于连接某端口。你应该也设置certfile选项。你可以使用全局选项domain_certfile为一个特定的域定义一个证书文件。
starttls_required
这个选项指定在连接到某端口时STARTTLS加密是必需的。不允许不加密的连接,你应该也设置certfile选项,你可以使用全局选项 domain_certfile为一个特定的域定义一个证书文件。
tls
这个选项指定某端口的通讯在连接之后将立刻使用SSL加密。这是一个早期的Jabber软件使用的传统加密方法,通常是在端口5223,用于客户端到服务器通讯。但是这个方法今天已经不推荐了使用。可取的加密方法是在端口5222使用STARTTLS,定义于RFC 3920: XMPP核心,这个方法在ejabberd里可以使用starttls选项来激活。如果这个选项被设置了,你应该同时设置certfile选项。选项tls也可用于 ejabberd_http以支持HTTPS。
web_admin
这个选项为ejabberd管理者激活Web Admin,可通过访问,登录和密码就是某个你在‘configure’access rule里授权了的已注册用户的用户名和密码。
zlib
这个选项指定在某端口的连接可使用Zlib流压缩(定义于)。
有一些额外的全局选项(listen之外的)可以在ejabberd配置文件指定:
{s2s_use_starttls, true|false}
这个选项定义是否为s2s连接使用 STARTTLS .
{s2s_certfile, Path}
一个包含SSL证书的文件的全路径.
{domain_certfile, Domain, Path}
包含一个特定域的SSL证书的文件的全路径.
{outgoing_s2s_options, Methods, Timeout}
指定用哪个地址尝试连接, 以什么顺序, 以及连接超时时间(以毫秒计). 缺省第一次尝试连接使用IPv4地址, 如果失败它将尝试使用IPv6, 超时时间为 10000 毫秒.
{s2s_dns_options, [ {Property, Value}, …]}
指定用于DNS解析的 properties. 允许的 Properties 有: 以秒计的缺省值为10的 timeout 和缺省值为2的重试次数.
{s2s_default_policy, allow|deny}
对于链入和链出到其他XMPP服务器的s2s连接的缺省策略. 缺省值是 allow.
{{s2s_host, Host}, allow|deny}
指定是否允许一个特定远程主机的链入和链出s2s连接. 这允许限制 ejabberd 只和少数信任的服务器建立s2s连接, 或禁止一些特定的服务器.
{s2s_max_retry_delay, Seconds}
连接失败后重试连接的最大允许延迟时间. 以秒计算. 这个缺省值是 300 秒 (5分钟).
{route_subdomains, local|s2s}
定义 ejabberd 是必须直接把节从本地路由到子域 subdomains(兼容 RFC 3920: XMPP核心), 还是使用S2S到外部服务器 (兼容 ).
例如, 以下简单配置定义:
(1)有三个域. 缺省证书文件是 server.pem. 然而, 连接到域example.com的c2s和s2s使用文件example_com.pem.
(2)端口 5222 使用 STARTTLS 监听 c2s 连接, 同时允许简单连接用于旧的客户端.
(3)端口 5223 使用旧的 SSL 监听 c2s 连接 .
(4)端口 5269 使用 STARTTLS 监听 s2s 连接. 这个socket设为IPv6而不是IPv4.
(5)端口 3478 监听通过 UDP 发出的 STUN 请求 .
(6)端口 5280 监听 HTTP 请求, 并伺服 HTTP 轮询服务.
(7)端口 5281 监听 HTTP 请求, 并使用 HTTPS 伺服 Web Admin. 这个socket只监听来自IP地址127.0.0.1的连接.
starttls,
tls,
http_poll
web_admin,
tls,
在这个例子, 定义了以下配置:
(1)端口 5222 (所有IPv4地址)和端口5223 (SSL, IP 192.168.0.1 和 fdca:8ab6:a243:75ef::1)监听c2s连接 ,并禁止名为 ‘bad’的用户.
(2)端口 5269 (所有IPv4地址)为了允许安全通讯而使用STARTTLS监听s2s连接. 远程XMPP服务器的链入和链出连接被禁止, 只有两个服务器可以连接: “jabber.example.org” 和 “example.com”.
(3)端口 5280 在所有的IPv4地址伺服 Web Admin 和 HTTP Polling 服务. 注意它也可能在不同端口伺服它们.
(4)除了管理员,所有用户的通讯流量限制为 1,000 Bytes/second
(5) aim.example.org 被连接到localhost IP 地址(127.0.0.1 and ::1)的 5233 端口 , 连接密码为‘aimsecret’.
(6)ICQ 网关 JIT (icq.example.org and sms.example.org) 被以密码‘jitsecret’连接到端口 5234 .
(7) msn.example.org 被以密码‘msnsecret’连接到端口 5235 .
(8) yahoo.example.org 被以密码‘yahoosecret’连接到端口 5236 .
(9) gg.example.org 被以密码‘ggsecret’连接到端口 5237 .
(10) jmc.example.org 被以密码‘jmsecret’连接到端口 5238 .
(11)服务自定义允许特别的选项用来逃避对从这个组件发送的包里检查from属性. 这个组件可以从服务器以任何用户的身份发送包, 或者甚至以任何服务器的身份.
ssl,
ejabberd_c2s,
ssl,
http_poll,
web_admin
注意, 对基于 jabberd14 或 WPJabber 的服务,你不得不做一个网关日志并通过它们本身做 XDB :
<!–
You have to add elogger and rlogger entries here when using ejabberd.
In this case the transport will do the logging.
–>
<log id
<logtype/>
<format>%d:
<file>/var/log/jabber/service.log</file>
</log>
<!–
Some XMPP server implementations do not provide
XDB services
xdb_file.so is loaded in to handle all XDB requests.
–>
<xdb id
<host/>
<load>
<!– this is a lib of wpjabber or jabberd14 –>
<xdb_file>/usr/lib/jabber/xdb_file.so</xdb_file>
</load>
<xdb_file xmlns
<spool><jabberd:cmdline flag
</xdb_file>
</xdb>
4、认证
选项 auth_method 定义了用于用户认证的认证方法. 语法是:
{auth_method, [Method, …]}.
ejabberd支持以下认证方法:
(1)internal (缺省)
(2)external
(3)ldap
(4)odbc
(5)anonymous
(6)pam
只有internal、external和odbc方法支持新建帐号.
当客户端尝试登录时,选项resource_conflict定义试已经连接了。选项的语法是:
.
可能的精确匹配值在XMPP Core: section 7.7.2.2中可以查到。缺省值是closeold。如果客户端用旧的Jabber Non-SASL认证(XEP-0078),则这个选项不重要,且执行closeold动作。
选项fqdn允许你定义机器的完全域名,假设没有被自动检测到。FQDN用于使用DIGEST-MD5 SASL机制认证的客户端,语法如下:
{fqdn, undefined|FqdnString}.
ejabberd使用它的内部数据库Mnesia作为缺省的认证方法. 这个值 internal 将允许内部认证方法.
选项{auth_password_format, plain|scram}定义用户密码存储格式:
plain
密码以纯文形式存储在数据库中。如果数据库泄露会很危险,因为密码可读。这是缺省值。这种格式允许客户端使用这些来认证:旧Jabber Non-SASL (XEP-0078), SASL PLAIN, SASL DIGEST-MD5, and SASL SCRAM-SHA-1.
scram
不存储密码,而仅仅存储HASH信息。不能从存储的信息获得原始文本密码,由于这个原因,这个值不能再转换为纯文本。这种格式允许客户端使用这些来认证:SASL PLAIN and SASL SCRAM-SHA-1.
例子:
(1)在example.org上使用internal认证, 在example.net上使用LDAP认证:
(2)在所有虚拟主机上用密码hash来进行internal认证:
服务器管理员能用任何语言来写external认证脚本。ejabberd和脚本之间接口的描述参见ejabberd开发指南。这儿也有一些认证脚本的例子。
这是是特定选项:
{extauth_program, PathToScript}
这个选项指示external认证脚本的全路径。该甲苯必须被ejabberd执行。
{extauth_instances, Integer}
指示在虚拟机上同时运行多少个脚本实例来为认证服务。最小数字的缺省值是1。
{extauth_cache, false|CacheTimeInteger}
缺省值为false,即禁用缓存功能。整数0启用静态缓存,但是不使用缓存信息来认证用户。如果设置为另一个整数值,则启用静态缓存和认证:CacheTimeInteger指示从用户最近断开连接依赖,ejabberd能重新使用认证信息的秒数,确保用户认证不再从扩展认证脚本查询。注意:如果internal认证启用了,则缓存不能再主机内启动。如果缓存启用了,在虚拟主机上mod_last或者mod_last_odbc必须被启用。
这个例子设置external认证,扩展认证脚本启用缓存为10分钟,并且为定义在ejabberd上的每个虚拟主机启动3个脚本实例:
{auth_method, [external]}.
{extauth_program, “/etc/ejabberd/JabberAuth.class.php”}.
{extauth_cache, 600}.
{extauth_instances, 3}.
这个值 anonymous 将允许internal认证方法.
匿名认证方法可以由以下选项配置. 记住你可以用 host_config 选项设置虚拟主机特有的选项. 注意关于也有一个详细的教程 .
{allow_multiple_connections, false|true}
这个选项只用于匿名模式已经被允许的时候. 设置它为 true 意味着在匿名登录模式里,如果使用不同的资源来连接,同样的用户名可以被使用多次. 这个选项只在非常特殊的情况下有用. 缺省值是 false.
{anonymous_protocol, sasl_anon | login_anon | both}
sasl_anon 意味着将使用 SASL 匿名方法. login_anon 意味着将使用匿名登录方法. both 意味着SASL匿名和匿名登录都允许.
例子:
(1)在所有虚拟主机上允许匿名登录:
(2)类似前例, 但限于public.example.org:
(3)在一个虚拟主机上允许匿名登录和internal认证:
(4)在一个虚拟主机上允许SASL匿名:
(5)在一个虚拟主机上允许SASL匿名和匿名登录:
(6)在一个虚拟主机允许SASL匿名, 匿名登录和inernal认证:
ejabberd支持通过插件认证模块(PAM)来认证. PAM目前在AIX、FreeBSD、HP-UX、Linux、Mac OS X、NetBSD和Solaris上都支持. PAM认证缺省是被禁止的, 所以你不得不配置和编译ejabberd以使其支持PAM:
.
选项:
{pam_service, Name}
这个选项定义了PAM服务名. 缺省是 “ejabberd”. 更多信息请参考你的操作系统的 PAM 文档.
例子:
虽然很容易配置ejabberd使其支持PAM, 但是PAM本身介绍了一些安全问题:
(1)为执行PAM认证,ejabberd使用扩展C-program来调用epam. 缺省情况下,它位于/var/lib/ejabberd/priv/bin/目录下. 在这个例子里,如果你的PAM模块要求root权限(例如pam_unix.so),你不得不把它设为root可执行. 你也不得不为ejabberd赋予访问这个文件的权限,并移除所有其它权限. 以root权限执行以下命令:
(2)确保系统上安装了最新版本的PAM. 一些旧版本的PAM模块会导致内存泄露. 如果你不能使用最新版本, 你可以定期杀掉(1) epam 进程以减少它的内存消耗: ejabberd将立刻重启这个进程.
(3)epam程序在认证失败时尝试关闭延迟. 然而, 一些PAM模块忽略这个行为并依靠它们自己的配置选项. 你可以新建一个配置文件ejabberd.pam. 这个例子展示如何在pam_unix.so模块关闭延迟:
#%PAM
auth sufficient pam_unix.so likeauth nullok nodelay
account sufficient pam_unix.so
这不是一个已准备好使用的配置文件: 当你建立你自己的PAM配置时,你必须显示使用它. 注意如果你想在PAM配置文件里设置在认证失败时禁止延迟, 你不得不限制访问这个文件, 这样恶意用户就不能使用你的配置来执行暴力攻击.
(4)你可能希望只允许特定用户登录访问. pam_listfile.so 模块提供这个功能.
(5)如果你使用 pam_winbind 来对一个Windows Active Directory授权, 那么 /etc/nssswitch.conf 必须被配置成使用winbind.
5、访问规则
在ejabberd里访问控制是通过访问控制列表(ACLs)来实现的. 配置文件中ACLs的声明语法如下:
{acl, ACLName, ACLValue}.
ACLValue 可以是以下之一:
all
匹配所有JIDs. 例子:
{user, Username}
匹配第一个虚拟主机,名字为 Username 的用户. 例子:
{user, Username, Server}
匹配JID为Username@Server加任何资源的用户. 例子:
{server, Server}
匹配从服务器Server来的任何JID. 例子:
{resource, Resource}
匹配任何资源为Resource的JID. 例子:
{shared_group, Groupname}
匹配这个虚拟主机上的共享名册组Groupname的任何成员. 例子:
{shared_group, Groupname, Server}
匹配虚拟主机Server上的共享名册组Groupname的任何成员. 例子:
{user_regexp, Regexp}
匹配本地虚拟主机上的任何名字符合Regexp的本地用户. 例子:
{user_regexp, UserRegexp, Server}
匹配服务器Server上名字符合UserRegexp的任何用户. 例子:
{server_regexp, Regexp}
匹配来自符合server_regexp的服务器的任何JID. 例子:
{resource_regexp, Regexp}
匹配资源符合resource_regexp的任何JID. 例子:
{node_regexp, UserRegexp, ServerRegexp}
匹配任何名字符合ServerRegexp的服务器上的任何名字符合UserRegexp的用户. Example:
{user_glob, Glob}
{user_glob, Glob, Server}
{server_glob, Glob}
{resource_glob, Glob}
{node_glob, UserGlob, ServerGlob}
这和上面一样. 然而, 它使用 shell glob 模式而不是 regexp. 这些模式能拥有以下特别的字符:
*
匹配任何单个字符.
[…]
匹配任何封闭的字符串. 字符范围由一对使用‘-’分割的字符串定义. 如果在‘[’之后的第一个字符是一个‘!’, 则匹配任何不封闭的字符.
以下 ACLName 是预定义的:
all
none
一个允许或禁止访问不同服务的条目. 语法是:
{access, AccessName, [ {allow|deny, ACLName}, …]}.
当一个JID被检查到可以访问 Accessname, 服务器顺序检查是否那个JID匹配任何在列表里元组的第二个元素. 如果匹配, 返回第一个匹配的元组的第一个元素, 否则返回值‘deny’.
如果你在一个虚拟主机上定义了特定的访问权限, 记住全局定义的访问权限比它们拥有优先权. 这意味着, 当发生冲突的时候, 使用全局服务器上的授权或禁止访问控制,而虚拟主机配置的访问控制无效.
例子:
以下 AccessName 是预定义的:
all
总是返回值‘allow’.
none
access max_user_sessions 定义了每个用户的最大会话(已认证的连接)数量. 如果一个用户尝试通过使用不同的资源打开更多的会话, 第一个打开的会话将被断开连接. session replace的错误信息将被发送到断开连接的会话. 这个选项的值可能是一个数字, 或infinity. 缺省值是infinity.
语法是:
{access, max_user_sessions, [ {MaxNumber, ACLName}, …]}.
这个例子对所有用户限制每用户会话数为5, 对管理员限制为10:
access max_s2s_connections 定义了可以建立多少个S2S连接到一个特定的远程XMPP服务器. 缺省值是1. 也可以使用access max_s2s_connections_per_node.
语法是:
{access, max_s2s_connections, [ {MaxNumber, ACLName}, …]}.
例子:
允许每个远程服务器最多3个连接:
6、Shapers
shaper允许你限制连接流量. 语法是:
{shaper, ShaperName, Kind}.
目前只支持maxrate . 语法如下:
{maxrate, Rate}
这里 Rate 代表最大允许每秒收到的字节数. 当一个连接超过了这个限制, ejabberd停止从socket读取数据,直到平均速率再次降到允许的最大值以下.
例子:
(1)定义一个 shaper 名为 ‘normal’ ,限制流量速度为 1,000 bytes/second:
(2)定义一个 shaper 名为‘fast’,限制流量速度为
{shaper, fast,
7、缺省语言
这个选项 language 定义服务器能被XMPP客户端识别的字符串的缺省语言. 如果一个XMPP客户端不支持 xml:lang, 将使用这里定义的语言.
这个选项的语法是:
{language, Language}.
缺省值是 en. 为了让它生效,在ejabberd的 msgs 目录必须有一个翻译文件 Language.msg.
例如, 设置俄语为缺省语言:
关于国际化和本地化的更多细节请参看这里,还有这里.
8、CAPTCHA
一些ejabberd模块可被配置成在特定的操作上要求CAPTCHA challenge. 如果客户端不支持 CAPTCHA Forms (), 将提供一个web连接让用户用web浏览器填写challege.
提供了一个示例脚本使用 ImageMagick 的转换程序来生成图片 .
配置选项为:
{captcha_cmd, Path}
{captcha_host, ProtocolHostPort}
ProtocolHostPort是一个包含主机名和可选的协议和端口号的字符串. 它必须定义ejabberd从哪里监听CAPTCHA请求。发给用户的URL格式为: ,缺省值是:协议http,第一个配置的主机名和端口号80。如果指定端口号不能精确匹配ejabberd监听的端口号(因为使用反向代理或者其它端口转换工具),则必须如下指定传输协议。
另外,一个ejabberd_http listener必须启用captcha选项。
示例配置:
…
captcha,
…
9、STUN
ejabberd可以当作一个独立的 STUN 服务器 (). 目前只支持绑定的使用. 在那个角色中,ejabberd 帮助客户端实现 Jingle ICE () 支持来发现它们的外部地址和端口.
你应该配置 ejabberd_stun 监听模块. 如果定义了 certfile 选项, ejabberd 在同一个端口复用TCP连接和通过TCP连接的TLS. 很明显, certfile选项仅为tcp定义. 注意无论如何,支持 TCP 或 TLS over TCP,对于绑定使用来说不是必需的,对于TURN功能是保留的. 只有udp传输可以随意配置.
示例配置:
…
…
你也需要正确地配置 DNS SRV 记录,这样客户端可以很容易地发现一个为你的XMPP域服务的 STUN 服务器. 具体请参考的 章节.
示例 DNS SRV 配置:
_stun._udp IN SRV
_stun._tcp IN SRV
_stuns._tcp IN SRV
10、包含其它配置文件
配置文件中的选项 include_config_file指示ejabberd立即包含其它配置文件.
基本语法:
{include_config_file, Filename}.
使用完整语法还可以指定子选项 suboptions :
{include_config_file, Filename, [Suboption, …]}.
filename 可使用绝对路径, 或使用主ejabberd配置文件的相对路径. 不能使用通配符. 文件必须存在且可读.
允许的子选项 suboptions 如下:
{disallow, [Optionname, …]}
不允许使用那些被包含配置文件中的选项. 满足这个条件的选项立刻变成不可接受. 缺省值为空列表: []
{allow_only, [Optionname, …]}
这是个基本例子:
在这个例子里, 被包含的文件不允许包含一个监听选项. 如果出现了这个选项, 该选项将不被接受. 这个文件在主配置文件所在目录的一个子目录中.
在这个例子, ejabberd.cfg 定义了一些 ACL 和 Access rules, 然后包含了另一个文件,里面含有其他 rules:
并且文件 acl_and_access.cfg 的内容可能如下:
11、配置文件中的宏选项
在ejabberd配置文件中, 有可能为一个值定义一个宏 macro,以后使用这个宏定义一个选项.
一个宏 macro 可用以下语法定义:
{define_macro, ’MACRO’, Value}.
MACRO 必须被一对单引号包住, 而且所有字母为大写; 检查以下例子. 值必须是任何合法的随意的 Erlang 项目.
macro的第一个定义会被保留的, 同一个macro的其它定义被忽略.
Macros 在包含了额外的配置文件之后会被处理, 所以有可能在知道用法之前就使用定义在被包含的配置文件里的 macros.
不能使用定义在另一个macro里面的macro.
有两个办法使用宏:
’MACRO’
{use_macro, ’MACRO’, Defaultvalue}
使用一个macro,即使它之前没有定义. 如果这个 macro 之前没有定义, 使用缺省值 defaultvalue. 这个用法看起来好像它已被定义并以以下方法使用:
‘MACRO’
这个例子展示一个宏的基本使用:
结果选项被ejabberd解释执行为: {loglevel, 5}.
这个例子展示值可以是任意的Erlang项目:
结果选项被ejabberd解释执行为: {acl, admin, {user, “bob”, “localhost”}}.
下面是一个复杂的例子:
‘PORT_S2S_IN’,
在解释执行之后结果为:
ejabberd缺省使用它内部的 Mnesia 数据库. 然而, 也可能使用关系数据库或一个LDAP服务器来存储持久信息, 长时间存在的数据. ejabberd是非常弹性的: 你可以为不同的虚拟主机配置不同的验证方法, 你可以为相同的主机配置不同的验证机制(fallback), 你可以为模块设置不同的存储系统, 此外.
ejabberd支持以下数据库:
(1)
(2)
(3)
(4)
(5)
以下 LDAP 服务器已经过ejabberd测试:
(1)
(2)
(3)通常任何LDAP兼容服务器都应该可以
关于虚拟主机,特别注意: 如果你在ejabberd.cfg定义了多个域, 你可能希望每个虚拟主机配置不同的数据库、验证和存储, 这样在两个虚拟主机之间用户名就不会冲突和混淆. 为此, 下一节的选项描述了必须在每个虚拟主机的 host_config 内部配置. 例如:
1、MySQL
尽管这一节将描述当你想使用原生的 MySQL驱动时 ejabberd 的配置, 它将不描述MySQL的安装和数据库的创建. 查看MySQL文档和教程 获得关于这些话题的信息. 注意该教程中包含的关于ejabberd的配置和本节是重复的.
而且, 你可可能会对目录 src/odbc 中的文件 mysql.sql 感兴趣. 这个文件包含ejabberd用于MySQL的schema. 该文件的结尾你可找到更新你的数据库架构schema的信息.
如果你已经使用ejabberd的二进制包安装了ejabberd,或者使用了内含的MySQL支持的ejabberd二进制包,那么你可以忽略此步骤.
(1)首先, 安装 . 确保被编译的文件在你的 Erlang 路径中; 你可以把它们放到和你的ejabberd .beam 文件相同的目录.
(2)然后, 以允许支持 ODBC 的选项配置并安装 ejabberd (这也需要原生 MySQL 支持!). 为此, 使用以下命令:
.
实际的数据库访问使用选项 odbc_server 来定义. 它的值通常用来定义我们是否想使用 ODBC, 或两个原生接口之一可用, PostgreSQL 或 MySQL.
为使用原生 MySQL 接口, 你可以通过一组如以下格式的参数:
{mysql, “Server”, “Database”, “Username”, “Password”}
mysql是一个关键字应该被保持. 例如:
{odbc_server, {mysql, “localhost”, “test”, “root”, “password”}}.
可选的, 有可能定义MySQL使用的端口. 这个选项只是在非常少的情况下有用, 当你没有以缺省端口设置来运行MySQL时. mysql参数可能是以下格式:
{mysql, “Server”, Port, “Database”, “Username”, “Password”}
Port值应该是一个整数, 没有引号. 例如:
{odbc_server, {mysql, “localhost”, Port, “test”, “root”, “password”}}.
缺省的ejabberd为每个虚拟主机打开10个到数据库的连接. 使用这个选项来修改该值:
你可以配置一个时间间隔来做一个假的SQL请求以保持到数据库的连接激活. 缺省值为 ’undefined’, 所以没有做 keepalive 请求. 指定以秒计: 例如 28800 意味着 8 小时.
如果到数据库的连接失败, ejabberd在重试之前等待30秒. 你可以这个选项修改这个间隔:
这个选项值的名字可能被误导, 因为 auth_method 名字用于通过ODBC以及通过原生MySQL接口访问关系数据库. 第一个配置步骤是定义 odbc auth_method. 例如:
MySQL也能被从多个ejabberd模块用于存储信息. 这些模块都有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于类似MySQL的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!
2、ODBC兼容
尽管本节将描述当你想使用原生的ODBC 驱动时ejabberd的配置, 它不描述安装和数据库创建. 查看你的数据库的文档. 教程 也会对你有所帮助. 注意该教程中包含的关于ejabberd的配置和本节是重复的.
如果你已经使用ejabberd的二进制包安装了ejabberd,或者包含了对ODBC的支持,那么可以忽略此步骤:
(1)首先, 安装 . 确保被编译的文件在你的 Erlang 路径中; 你可以把它们放到和你的ejabberd .beam 文件相同的目录.
(2)然后, 以允许支持 ODBC 的选项配置并安装 ejabberd. 为此, 使用以下命令:
.
实际的数据库访问使用选项 odbc_server 来定义. 它的值通常用来定义我们是否想使用 ODBC, 或两个可用的原生接口之一, PostgreSQL 或 MySQL.
通过ODBC使用数据库, 你可以通过一个ODBC连接字符串作为odbc_server参数. 例如:
缺省的ejabberd为每个虚拟主机打开10个到数据库的连接. 使用这个选项来修改该值:
你可以配置一个时间间隔来做一个假的SQL请求以保持到数据库的连接激活. 缺省值为 ’undefined’, 所以没有做 keepalive 请求. 指定以秒计: 例如 28800 意味着 8 小时.
第一个配置步骤是定义 odbc auth_method. 例如:
一个ODBC兼容数据库也能被多个ejabberd模块用于存储信息.这些模块都有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于ODBC兼容的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!
3、LDAP
ejabberd拥有内建的LDAP支持. 你可以通过LDAP服务器验证用户并使用LDAP目录作为vCard存储器.
通常ejabberd把LDAP看作一个只读存储: 它可能察看数据, 但不能新建账号或修改存储在LDAP里的vCard. 然而, 修改密码是可能的,如果允许 mod_register 模块并且LDAP服务器支持.
参数:
{ldap_servers, [Servers, …]}
{ldap_encrypt, none|tls}
{ldap_port, Number}
{ldap_rootdn, RootDN}
{ldap_password, Password}
例子:
你可以通过LDAP目录验证用户. 可用的选项有:
{ldap_base, Base}
{ldap_uids, [ {ldap_uidattr} | {ldap_uidattr, ldap_uidattr_format}, …]}
%% vCard fields to be reported
%% Note that JID is always returned with search results
…
注意 mod_vcard_ldap 模块在LDAP搜索用户的信息之前会先检查用户是否存在.
Active Directory 只是一个预定义属性的LDAP-服务器. 示范配置如下:
…
…
选项 modules 定义ejabberd启动后将被装载的模块的列表. 列表中的每个条目是一个元组,第一个元素是一个模块的名称,第二个是一个模块列表的选项.
语法是:
{modules, [ {ModuleName, ModuleOptions}, …]}.
例子:
(1)在这个例子里只有模块 mod_echo 被装载且没有在方括号内指定该模块的选项:
(2)在第二个例子里不带选项地装载了模块 mod_echo, mod_time, 和 mod_version. 特别注意, 除了最后一个条目, 所有条目都以一个逗号结尾:
1、模块一览
2、通用选项
3、mod_announce
4、mod_disco
5、mod_echo
6、mod_http_bind
7、mod_http_fileserver
8、mod_irc
9、mod_last
10、mod_muc
11、mod_muc_log
12、mod_offline
13、mod_ping
14、mod_privacy
15、mod_private
16、mod_proxy65
17、mod_pubsub
18、mod_register
19、mod_roster
20、mod_service_log
21、mod_shared_roster
22、mod_sic
23、mod_stats
24、mod_time
25、mod_vcard
26、mod_vcard_ldap
27、mod_vcard_xupdate
28、mod_version
未完待续。。。
from:http://blog.chinaunix.net/uid-22312037-id-3507236.html










