<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jabbercn.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=How</id>
		<title>Jabber/XMPP中文翻译计划 - 用户贡献 [zh-cn]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=How"/>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/How"/>
		<updated>2026-04-23T21:31:44Z</updated>
		<subtitle>用户贡献</subtitle>
		<generator>MediaWiki 1.18.2</generator>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0147</id>
		<title>XEP-0147</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0147"/>
				<updated>2012-08-21T12:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;How: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0147.html XEP-0147]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0147: XMPP URI Scheme查询组件'''&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!摘要:&lt;br /&gt;
|本文定义了一个查询组件的注册项用于XMPP IRIs/URIs的上下文，也指定了注册项的值的首次提交步骤.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!作者:&lt;br /&gt;
|Peter Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
!版权:&lt;br /&gt;
|© 1999 - 2012 XMPP标准化基金会(XSF). 参见[[XEP-0147#法律通告|法律通告]].&lt;br /&gt;
|-&lt;br /&gt;
!状态:&lt;br /&gt;
|活跃&lt;br /&gt;
|-&lt;br /&gt;
!类型:&lt;br /&gt;
|信息&lt;br /&gt;
|-&lt;br /&gt;
!版本:&lt;br /&gt;
|1.2&lt;br /&gt;
|-&lt;br /&gt;
!最后更新日期:&lt;br /&gt;
|2006-09-13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
注意: 这个信息性的协议定义了一个已经被XMPP评议会 和/或 XSF董事会批准的最佳实践或协议范本. 该协议被鼓励实现并且这一最佳实践或或协议范本适于部署到生产环境.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
==术语==&lt;br /&gt;
==查询操作==&lt;br /&gt;
===消息操作===&lt;br /&gt;
===名册管理操作===&lt;br /&gt;
====添加名册条目====&lt;br /&gt;
====删除名册条目====&lt;br /&gt;
===订阅管理操作===&lt;br /&gt;
====订阅====&lt;br /&gt;
====取消订阅====&lt;br /&gt;
==国际化事项==&lt;br /&gt;
==安全事项==&lt;br /&gt;
==IANA事项==&lt;br /&gt;
==XMPP注册项事项==&lt;br /&gt;
===XMPP IRI/URI查询类型注册项===&lt;br /&gt;
====注册过程====&lt;br /&gt;
====注册项====&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
===附录C:法律通告===&lt;br /&gt;
===附录D:和XMPP的关系===&lt;br /&gt;
===附录E:讨论地点===&lt;br /&gt;
===附录F:需求一致性===&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
测试&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2011-12-26T05:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 关闭流 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权通知'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个留上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#关键字|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#IRI|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#UNICODE|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这种形式是绝对不会在XMPP系统将通过网络发送的.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; 本文或常用参考文档中的协议规范所用到的所有用例里面提供的例子都遵从上述规则. 所有例子都是虚构的并且交换的信息 (例如, 用户名和密码) 不代表任何现存的用户和服务器.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
&lt;br /&gt;
XMPP提供一种异步的端到端的结构化数据交换技术，在一个分布式的可全球寻址和出席信息感知的客户端和服务器的网络中使用直接的持久XML流。这种体系结构形式包含了普遍的网络可用性的知识，以及在给定的客户端-服务器和服务器-服务器会话的时候，不限数量的并发信息交易的概念，所以我们把它称为 &amp;quot;并发交易可用性&amp;quot; (&amp;quot;Availability for Concurrent Transactions&amp;quot;) (简称ACT) 来把它和来自WWW的 &amp;quot;Representational State Transfer&amp;quot; [[RFC6120#REST|REST]] 体系结构形式区别开. 尽管XMPP的体系结构很大程度上类似于 email (参见 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]], 它引入了一些变化以便于准实时通讯.  ACT体系结构形式的独特特性如下. &lt;br /&gt;
&lt;br /&gt;
===全局地址===&lt;br /&gt;
&lt;br /&gt;
和email一样, 为了通过网络路由和递送消息,XMPP使用全球唯一地址(基于DNS). 所有XMPP实体可以在网络上被寻址, 大部分客户端和服务器以及很多外部服务可以被客户端和服务器访问. 通常, 服务器地址的格式为 &amp;lt;域部分&amp;gt; (例如, &amp;lt;im.example.com&amp;gt;), 属于某台服务器的帐号的格式为 &amp;lt;本地部分@域部分&amp;gt; (例如, &amp;lt;juliet@im.example.com&amp;gt;, 称为 &amp;quot;纯JID&amp;quot;), 而连接到一个特定的设备或资源并且已经被(服务器)授权可以和外部交互的客户端的格式为 &amp;lt;本地部分@域部分/资源部分&amp;gt; (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt;, 称为 &amp;quot;全JID&amp;quot;). 因为历史原因, XMPP地址常被称为Jabber IDs 或 JIDs. 因为XMPP地址格式的正式规范依赖于国际化技术（本文撰写时正在制定中），这个格式定义于 [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] 而非本文之中. 术语 &amp;quot;localpart&amp;quot;(本地部分), &amp;quot;domainpart&amp;quot;（域部分）, 和 &amp;quot;resourcepart&amp;quot;（资源部分） 正式定义于  [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] .&lt;br /&gt;
&lt;br /&gt;
===出席信息===&lt;br /&gt;
&lt;br /&gt;
XMPP让一个实体能够向其他实体声明它的网络可用性或者 &amp;quot;presence&amp;quot;（出席信息） . 在XMPP中, 这种可通讯状态是用端到端的专用通讯元素来标识的: 即 &amp;lt;presence/&amp;gt; 节. 尽管网络可用性对于XMPP消息交换并不是必需的, 它还是可以促进实时交互，因为消息发起者可以在发消息之前知道接收者在线并处于可通讯状态. 端到端的出席信息定义于 [[RFC6120#XMPP‑IM|XMPP‑IM]] .&lt;br /&gt;
&lt;br /&gt;
===持久流===&lt;br /&gt;
&lt;br /&gt;
每个点对点的一&amp;quot;跳&amp;quot;都建立了基于TCP长连接的持久XML流来保持可通讯状态. 这些 &amp;quot;always-on&amp;quot; 客户端-服务器 和 服务器-服务器 流使得任何时间每方都能够推送数据到另一方并且立即路由和递送. XML流定义于 [[RFC6120#XML流|4]] .&lt;br /&gt;
&lt;br /&gt;
===结构化数据===&lt;br /&gt;
&lt;br /&gt;
XMPP中基本的协议数据单元不是一个XML流 (它只是为点对点通讯提供传输层) 而是一个 XML 节（&amp;quot;stanza&amp;quot;), 它是一个通过流发送的XML片段. 一个节的根元素包括路由属性 (类似 &amp;quot;from&amp;quot; 和 &amp;quot;to&amp;quot; 地址), 而节的子元素包含了递送给目标接收者的载荷. XML节定义于 [[RFC6120#XML节|8]] .&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;br /&gt;
&lt;br /&gt;
在实践之中, XMPP是一个包含了很多互相通讯的客户端和服务器的网络(当然, 任何两个给定的布署服务器之间的通讯都是严格谨慎的并且也和本地服务策略有关). 因此, 例如, 与服务器 &amp;lt;im.example.com&amp;gt; 关联的用户 &amp;lt;juliet@im.example.com&amp;gt; 能够和服务器 &amp;lt;example.net&amp;gt; 关联的用户 &amp;lt;romeo@example.net&amp;gt; 交换消息，出席信息和其他结构化数据. 这个模式对使用全局地址的消息协议是很常见的, 例如email网络 (见 [[RFC6120#SMTP|SMTP]] 和 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]] . 结果, 在XMPP中端到端的通讯是逻辑上的点对点，而物理结构则是 客户端-服务器-服务器-客户端, 如下图所示. &lt;br /&gt;
&lt;br /&gt;
'''图1: 分布式客户端-服务器 体系结构'''&lt;br /&gt;
&lt;br /&gt;
  example.net &amp;lt;--------------&amp;gt; im.example.com&lt;br /&gt;
      ^                                ^&lt;br /&gt;
      |                                |&lt;br /&gt;
      v                                v&lt;br /&gt;
 romeo@example.net           juliet@im.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 体系结构使用 [[RFC6120#XML流|XML流]] 和 [[RFC6120#XML节|XML节]] ，但是两个客户端之间直接建立端到端的连接则使用基于 [[RFC6120#LINKLOCAL|LINKLOCAL]] 的技术, 不过那个体系结构没有定义在本协议之中，它只能说是 &amp;quot;类XMPP&amp;quot;; 详见 [[RFC6120#XEP‑0174|XEP‑0174]] . 另外, XML流可以在任何可靠的传输层上简历端到端的连接, 包括XMPP本真的扩展; 无论如何, 这些方法没有包含在本文之中.&lt;br /&gt;
&lt;br /&gt;
以下段落描述客户端和服务器们各自在网络中负责什么.&lt;br /&gt;
&lt;br /&gt;
一个客户端就是一个实体，它先和它的注册帐号所在服务器建立XML流 (通过 [[RFC6120#SASL握手|SASL握手]] ) , 然后完成 [[RFC6120#资源绑定|资源绑定]] , 这样就能通过建好的流在客户端和服务器之间递送XML节. 客户端使用 XMPP 来和它的服务器, 其他客户端以及任何其他网络上的实体通讯, 这里服务器负责递送节到同一台服务器上其他已连接的客户端，或把它们路由到远程服务器上. 一个服务器上的注册帐号可以同时使用多个客户端连接到一台服务器上, 这里每个客户端的XMPP地址的 ''资源部分'' 是不同的 (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;), 定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 和 [[RFC6120#资源绑定|7]]&lt;br /&gt;
&lt;br /&gt;
一个服务器是一个实体，主要负责以下事项: &lt;br /&gt;
&lt;br /&gt;
:* 管理已连接客户端的 [[RFC6120#XML流|XML流]] 并通过建好的流递送 [[RFC6120#XML节|XML节]] 到那些通过客户端; 这也包括负责确保客户端在被授权访问XMPP网络之前的客户端身份验证工作.&lt;br /&gt;
:* 遵循本地服务对服务器之间通讯的策略, 管理和远程服务器之间的 [[RFC6120#XML流|XML流]] 并通过建好的流路由 [[RFC6120#XML节|XML节]] 到那些服务器.&lt;br /&gt;
&lt;br /&gt;
取决于服务器的不同, 一个XMPP服务器的次要责任可能包括: &lt;br /&gt;
&lt;br /&gt;
:* 存储客户端使用的数据 (例如, 用户的基于 [[RFC6120#常规引用|XMPP-IM]] 的联系人; 在这种情况下, 相关的XML节直接由服务器本身代替客户端来处理而不用路由到远程服务器或递送到一个已连接的客户端.&lt;br /&gt;
:* 托管的额外服务也使用XMPP作为通讯的基础，但是提供超出本文范围的额外的或 [[RFC6120#常规引用|XMPP-IM]] 定义的功能; 例子包括多用户会议服务(定义于 [[RFC6120#常规引用|XEP‑0045]] ) 和 发布-订阅 服务 (定义于 [[RFC6120#常规引用|XEP‑0060]] ).&lt;br /&gt;
&lt;br /&gt;
==TCP绑定==&lt;br /&gt;
===范围===&lt;br /&gt;
&lt;br /&gt;
如本文定义的XMPP所述, 一个发起方实体在 (客户端或服务器) 和接收方实体协商XML流之前必须(MUST) 打开一个到接收方实体 (服务器) 的 [[RFC6120#常规引用|TCP]] 连接. 然后在使用XML流期间双方一直保持那个TCP连接. 这个规则在下面章节中的TCP绑定要用到.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 不一定要把XML流建立在TCP上, 其他传输协议也是可以的. 例如, 两个实体可以通过 [[RFC6120#提示性引用|HTTP]] 互相连接（定义于 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] . 无论如何, 本协议只定义把XMPP绑定到TCP.&lt;br /&gt;
&lt;br /&gt;
===合格的全域名解析===&lt;br /&gt;
&lt;br /&gt;
因为XML流是是通过TCP发送的, 发起方实体在尝试打开一个XML流之前需要确定接收方实体的IPv4或IPv6地址(以及端口). 一般来说这是通过解析接收方实体的合格的全域名(简称FQDN,参见 [[RFC6120#常规引用|DNS概念]] )来实现的. &lt;br /&gt;
&lt;br /&gt;
====首选流程:SRV查询====&lt;br /&gt;
&lt;br /&gt;
FQDN解析的首选流程是如下使用 [[RFC6120#常规引用|DNS‑SRV]] 记录: &lt;br /&gt;
&lt;br /&gt;
# 发起方实体构造一个 DNS SRV 查询，参数如下:&lt;br /&gt;
## 一个 &amp;quot;xmpp-client&amp;quot; (用于 客户端-服务器 连接) 或 &amp;quot;xmpp-server&amp;quot; (用于 服务器-服务器 连接)服务&lt;br /&gt;
## 一个 &amp;quot;tcp&amp;quot; 协议&lt;br /&gt;
## 一个对应发起方实体希望连接的XMPP服务的 &amp;quot;原有域&amp;quot;（ [[RFC6120#常规引用|TLS‑CERTS]] ）的名字 (例如, &amp;quot;example.net&amp;quot; 或 &amp;quot;im.example.com&amp;quot;)&lt;br /&gt;
# 得到一个类似 &amp;quot;_xmpp-client._tcp.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.im.example.com.&amp;quot; 的查询.&lt;br /&gt;
# 如果收到应答, 它将包含一个或多个FDQN和端口的组合, 每个都拥有权重和优先级 (如 [[RFC6120#常规引用|DNS‑SRV]] 所述). (无论如何, 如果SRV查询的结果是一个单独的资源记录 &amp;quot;.&amp;quot;, 即根域名, 那么发起方实体必须(MUST)在这时终止SRV处理，因为根据 [[RFC6120#常规引用|DNS‑SRV]] ,这样一个结果意味着那个服务在本域中是不可用的)&lt;br /&gt;
# 发起方实体至少选择返回的FQDNs记录中的一个来解决 (根据 [[RFC6120#常规引用|DNS‑SRV]] 规则,对FDQN执行 DNS &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 查询; 这将返回一个 IPv4 或 IPv6 的地址.&lt;br /&gt;
# 成功解析FDQN(包括SRV查询返回的相应的端口号)之后,发起方实体就使用IP地址来连接接收方实体.&lt;br /&gt;
# 如果发起方实体使用那个IP地址连接失败，而的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 记录查询返回了不止一个IP地址, 那么发起方实体使用那个FDQN的下一个解析好的IP地址作为连接地址.&lt;br /&gt;
# 如果发起方实体用给定的FDQN的所有解析出来的IP地址都无法连接, 那么它重复解析过程并使用基于优先级和权重的SRV查询(定义于 [[RFC6120#常规引用|DNS SRV]] )返回的下一个FQDN来连接.&lt;br /&gt;
# 如果发起方实体接收到它的SRV应答但是无法使用接收到的应答数据来建立一个XMPP连接, 它不应该(SHOULD NOT)尝试下面描述的备用流程(这有助于防止入站和出站连接状态不匹配).&lt;br /&gt;
# 如果发起方实体不能从它的SRV查询接收到应答, 它应该(SHOULD)尝试下一节描述的备用流程.&lt;br /&gt;
&lt;br /&gt;
====后备流程====&lt;br /&gt;
&lt;br /&gt;
后备流程应该(SHOULD)是一个常规的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 地址记录解析以决定原始域的IPv4或IPv6地址, 而端口则为 &amp;quot;xmpp-client&amp;quot; 端口(5222)用于客户端-服务器连接或 &amp;quot;xmpp-server&amp;quot; 端口(5269)用于服务器-服务器连接 (这些是在IANA注册的缺省端口，[[RFC6120#端口号和服务名|14.7]] .&lt;br /&gt;
&lt;br /&gt;
如果通过TCP连接不成功, 发起方实体可能尝试找到并使用替代连接方法例如HTTP绑定 (见 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] , 它可能使用 [[RFC6120#提示性引用|DNS‑TXT]] 记录(参见 [[RFC6120#提示性引用|XEP‑0156]]) 来搜索.&lt;br /&gt;
&lt;br /&gt;
====什么时候不用SRV====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体已经被显式地配置为一个关联到接收实体的原始域的一个特定的FQDN (以及潜在的端口) (比如,一个特定的原始域 example.net  &amp;quot;写死&amp;quot; 到一个配置好的 apps.example.com 的 FQDN), 鼓励初始方实体使用配置好的名字而不是建议的对原始域的SRV解析流程.&lt;br /&gt;
&lt;br /&gt;
====附加服务使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
很多XMPP服务器以可托管附加服务 (超出本文和 [[RFC6120#常规引用|XMPP-IM]] 定义范围) 这种方式来实现，附加服务的DNS域名典型的形式是主XMPP服务的 &amp;quot;子域名&amp;quot; (例如, conference.example.net 用于 [[RFC6120#常规引用|XEP‑0045]] 服务,相关的XMPP主服务为 example.net ) 或 底层服务的一级域名的 &amp;quot;子域名&amp;quot; (例如, muc.example.com 用于 [[RFC6120#常规引用|XEP‑0045]] 服务，相关的XMPP主服务为 im.example.com ). 如果一个和远程XMPP服务关联的实体希望连接到这样一个附加服务上, 它将生成一个适当的XML节，而远程服务器将尝试通过一个SRV查询资源记录类似 &amp;quot;_xmpp-server._tcp.conference.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.muc.example.com.&amp;quot; 来解析该附加服务的DNS域名. 所以, 如果一个XMPP服务的管理员希望让远程服务器相关的实体能访问这样的附加服务, 除了用于他们的主XMPP服务的 &amp;quot;_xmpp-server&amp;quot; 记录之外, 他们还需要声明适当的 &amp;quot;_xmpp-server&amp;quot; SRV 记录. 当 SRV 记录不可用的时候, 可使用后备方法 [[RFC6120#后备流程|3.2.2]] 来为附加服务解析域名.&lt;br /&gt;
&lt;br /&gt;
===重连===&lt;br /&gt;
&lt;br /&gt;
XMPP服务器可能在会向连接的客户端和远端服务器提供TCP连接服务的时候意外掉线. 因为这些连接的数量可能非常大, 实体的重连机制寻求解决重连可能导致的对软件性能的冲剂和网络堵塞. 如果实体选择重连, 它: &lt;br /&gt;
&lt;br /&gt;
:* 应该把重连之前等待的秒数设置为0到60之间 (这有助于确保不会所有实体在掉线的同一个时间间隔之后同时尝试重连).&lt;br /&gt;
:* 如果第一次尝试重连没有成功则随后的尝试重连的时间间隔应该越来越长 (例如, 按照 [[RFC6120#提示性引用|ETHERNET]] 描述的 &amp;quot;动态二进制指数后退算法&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
建议重连的时候使用TLS会话恢复 [[RFC6120#提示性引用|TLS‑RESUME]] . 本文未来的某个版本, 或某个独立的协议, 可能会提供更多详细的关于加速重连过程的方法的指南.&lt;br /&gt;
&lt;br /&gt;
===可靠性===&lt;br /&gt;
&lt;br /&gt;
在XMPP使用常连的TCP连接意味着通过XML流发送的XML节可能不可靠, 因为长连的TCP的各方可能无法及时地了解掉线情况. 在XMPP应用层, 长连接掉线可能导致无法发送节. 尽管本文定义的核心XMPP技术未包括克服这一可靠性缺陷的特性, 有一个XMPP扩展在做这件事 (例如, [[RFC6120#提示性引用|XEP‑0198]] ).&lt;br /&gt;
&lt;br /&gt;
==XML流==&lt;br /&gt;
===流基础===&lt;br /&gt;
&lt;br /&gt;
两个基本概念，使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换：XML流和XML节。这些术语的定义如下。&lt;br /&gt;
&lt;br /&gt;
:XML流的定义:&lt;br /&gt;
::XML流是一个容器，用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 &amp;quot;流头&amp;quot; (即, 一个包含了适当树形和命名空间声明的 XML &amp;lt;stream&amp;gt; 标签), 而这个XML流的结尾明确表达为一个关闭的XML &amp;lt;/stream&amp;gt; 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 [[RFC6120#提示性引用|TLS协商]] 或 [[RFC6120#提示性引用|SASL协商]] ) 或用于 XML节. &amp;quot;发起流&amp;quot; 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 &amp;quot;连接到&amp;quot; 或 &amp;quot;和......开启会话&amp;quot; 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 (&amp;quot;应答流&amp;quot;).&lt;br /&gt;
:XML节的定义:&lt;br /&gt;
::XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1)，它的元素名是 &amp;quot;message&amp;quot;, &amp;quot;presence&amp;quot;, 或 &amp;quot;iq&amp;quot; ，而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素但不在第一层 (例如, 包含在一个扩展元素中的 &amp;lt;message/&amp;gt; 元素 ( 做报告用的 [[RFC6120#扩展内容|8.4]] )也不是一个XML节, 不是命名空间 'jabber:client' 或 'jabber:server'限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 [[RFC6120#常规引用|XML‑NAMES]] 和本协议的 [[RFC6120#扩展内容|8.4]]).&lt;br /&gt;
&lt;br /&gt;
有三种节: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的缩写). 这些节类型提供三种不同的通讯原语: 一个 &amp;quot;推送&amp;quot; 机制用于已生成的消息, 一个特定的 &amp;quot;发行-订阅&amp;quot; 机制用于广播网络可用性信息, 和一个 &amp;quot;请求-应答&amp;quot; 机制用于更结构化的数据交换 (类似 [[RFC6120#提示性引用|HTTP]] . 更多解释分别位于 [[RFC6120#Messsage语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] . &lt;br /&gt;
&lt;br /&gt;
考虑一个客户端连接到一个服务器的例子. 客户端通过发送一个流头来发起一个XML流到服务器, 最好在前面加上一个XML声明来指定XML版本和支持的字符串编码 (见 [[RFC6120#包含XML声明|11.5]] 和 [[RFC6120#字符串编码|11.6]] ). 遵循本地策略和服务设置, 该服务器接着以第二个XML流应答回客户端, 最好再次在前面加上一个XML声明. 一旦客户端完成 [[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] , 该客户端就能通过这个流来发送不限数量的XML节. 当客户端想要关闭这个流的时候, 它只要简单的发送一个关闭 &amp;lt;/stream&amp;gt; 标签给服务器，如 [[RFC6120#关闭流|4.4]] . &lt;br /&gt;
&lt;br /&gt;
基本上, 接着, 一个XML流功能作为会话期间发送的XML节的信封而另一个XML流功能作为会话期间接收的XML节的信封. 我们可以如下做一个简单的展示. &lt;br /&gt;
&lt;br /&gt;
'''图2: 两个流的简单视图'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| INITIAL STREAM     |  RESPONSE STREAM   |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| &amp;lt;stream&amp;gt;           |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;stream&amp;gt;           |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;presence&amp;gt;         |                    |&lt;br /&gt;
|   &amp;lt;show/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/presence&amp;gt;        |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;message to='foo'&amp;gt; |                    |&lt;br /&gt;
|   &amp;lt;body/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/message&amp;gt;         |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;iq to='bar'       |                    |&lt;br /&gt;
|     type='get'&amp;gt;    |                    |&lt;br /&gt;
|   &amp;lt;query/&amp;gt;         |                    |&lt;br /&gt;
| &amp;lt;/iq&amp;gt;              |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;iq from='bar'     |&lt;br /&gt;
|                    |     type='result'&amp;gt; |&lt;br /&gt;
|                    |   &amp;lt;query/&amp;gt;         |&lt;br /&gt;
|                    | &amp;lt;/iq&amp;gt;              |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| [ ... ]            |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | [ ... ]            |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;/stream&amp;gt;          |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;/stream&amp;gt;          |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那些习惯于把XML当成一个文档中心的方式的人可能会发现下面的类比是有益的: &lt;br /&gt;
&lt;br /&gt;
:* 两个XML流像两个 &amp;quot;文档&amp;quot; (相当于 [[RFC6120#常规引用|XML]] 的&amp;quot;文档&amp;quot; 产生)，它们是通过积累XML节来建立的.&lt;br /&gt;
:* 根 &amp;lt;stream/&amp;gt; 元素像每个 &amp;quot;文档&amp;quot; 的 &amp;quot;文档实体&amp;quot; (详见 [[RFC6120#常规引用|XML]] 的4.8章).&lt;br /&gt;
:* 通过流发送的XML节像该 &amp;quot;文档&amp;quot;的 &amp;quot;片段&amp;quot; (详见 [[RFC6120#提示性引用|XML‑FRAG]] ).&lt;br /&gt;
&lt;br /&gt;
无论如何, 这些描述只是类比, 因为XMPP不处理文档和片段而是处理流和节. &lt;br /&gt;
&lt;br /&gt;
本节的其余部分定义XML流（连同相关主题）的以下几个方面：&lt;br /&gt;
&lt;br /&gt;
:* 如何打开流 ( [[RFC6120#打开流|4.2]] )&lt;br /&gt;
:* 流协商过程 ( [[RFC6120#流协商|4.3]] )&lt;br /&gt;
:* 如何关闭流 ( [[RFC6120#关闭流|4.4]] )&lt;br /&gt;
:* XML流的方向性 ( [[RFC6120#方向性|4.5]] )&lt;br /&gt;
:* 如何处理沉默的对端 ( [[RFC6120#处理沉默对端|4.6]] )&lt;br /&gt;
:* 流的XML属性 ( [[RFC6120#流属性|4.7]] )&lt;br /&gt;
:* 流的XML命名空间 ( [[RFC6120#流命名空间|4.8]] )&lt;br /&gt;
:* 和XML流相关的错误处理 ( [[RFC6120#流错误|4.9]] )&lt;br /&gt;
&lt;br /&gt;
===打开流===&lt;br /&gt;
&lt;br /&gt;
连接到接收方实体的适当的IP地址和端口之后, 发起方实体通过发送一个流头 (&amp;quot;发起流头&amp;quot;) 来打开到接收方实体的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后接收方实体通过发送一个它自己的流头 (&amp;quot;应答流头&amp;quot;) 来回复发起方实体. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着实体们就可以在进行流协商过程的其他步骤了.&lt;br /&gt;
&lt;br /&gt;
===流协商===&lt;br /&gt;
====基本概念====&lt;br /&gt;
&lt;br /&gt;
因为流的接收方实体可以说是它所服务的域的看门人, 它对客户端或对端服务器的发起的连接有一定的条件要求. 最低程度, 发起方实体在接收方实体被允许发送节之前需要验证接收方实体， (对客户-服务器流来说这意味着使用 [[RFC6120#SASL协商|6]] 中描述的SASL). 无论如何, 接收方实体可以考虑其他验证条件来强制协商, 例如使用 [[RFC6120#TLS协商|5]] 描述的TLS加密. 接收方实体通知发起方实体这些条件通过 &amp;quot;stream features&amp;quot;: 发起方需要在接收方接受它发送的XML节之前完成的一系列特别的协议交互, 以及任何自愿协商但是可以提高XML流处理的协议交互 (例如,  [[RFC6120#提示性引用|XEP‑0138]] 描述的建立应用层压缩). &lt;br /&gt;
&lt;br /&gt;
连接条件的存在意味着流需要协商. 层的顺序 ( [[RFC6120#层的顺序|13.3]] 描述的的TCP, 然后是TLS, 然后是SASL, 然后是XMPP) 意味着流协商是一个多级的过程. 进一步的结构由两个因素来施加: (1) 一个给定的流特性可以仅对特定的实体提供，或只在特定的其他特性已经被协商之后提供 (例如, 资源绑定仅在SASL验证之后提供), 和 (2) 流特性可能是强制协商也可能是自愿协商. 最后, 基于安全的原因一个流的参与者们在成功地完成用于特定特性的协议交互之后需要忘掉它们在协商过程中获得的知识 (例如, 在所有情况下的TLS和当可能建立一个安全层的情况下的SASL, 如有关SASL机制的规范所述). 使用刷新旧的流上下文和通过现有的TCP连接交换新的流头就可以做到这一点.&lt;br /&gt;
&lt;br /&gt;
====流特性格式====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体包含在发起流头里的 'version' 属性值设为不低于 &amp;quot;1.0&amp;quot; (见 [[RFC6120#版本|4.7.5]] ), 接收方实体在发送应答流头之后必须发送一个&amp;lt;features/&amp;gt; 子元素 (通常使用 [[RFC6120#命名空间声明和前缀|4.8.5]] 描述的流命名空间前缀作为前缀) 给发起方实体以声明使流协商过程继续下去的任何条件. 每个条件用 &amp;lt;features/&amp;gt; 元素的子元素的格式, 由一个不同于流命名空间和内容命名空间的命名空间来限定. &amp;lt;features/&amp;gt; 元素可以包含一个字元素，多个子元素，或者为空.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 包含在任何给定的&amp;lt;features/&amp;gt;元素的子元素的顺序不重要.&lt;br /&gt;
&lt;br /&gt;
如果一个特殊的流特性是或者可以是强制协商的, 那个特性的定义需要做以下几件事之一: &lt;br /&gt;
&lt;br /&gt;
:# 声明这个特性总是强制协商的 (例如, XMPP客户端的资源绑定就是这样的); 或&lt;br /&gt;
:# 为接收方实体指定一个方法来标记这个特性在这次交互中为强制协商 (例如, 对于 STARTTLS, 这是通过包含一个空的 &amp;lt;required/&amp;gt; 元素到流特性广告中来实现的, 但是对所有流特性的通用格式); 建议用于新的强制协商特性的流特性定义如 STARTTLS 所做的那样通过包含一个空的 &amp;lt;required/&amp;gt; 元素来实现.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 因为没有通用格式来说明一个特性是强制协商的, 有可能会出现一个发起方实体不能理解的特性而被接收方认为是强制协商的, 而导致流协商过程失败. 尽管这样一个结果是不可取的, 本工作组认为不需要通用格式的情况是很罕见的.&lt;br /&gt;
&lt;br /&gt;
基于安全性的原因, 对于必要的特定流特性，在该特性协商成功之后，发起方将发送一个新的发起流头 (例如, 任何情况下的TLS和当建立了安全层的情况下的SASL). 如果一个给定的流特性出现在这种情况下, 那个特性的定义需要指定该特性协商之后的流重启. &lt;br /&gt;
&lt;br /&gt;
一个包含至少一个强制协商特性的&amp;lt;features/&amp;gt;元素标识流协商没有完成并且发起方实体必须协商更多的特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个&amp;lt;features/&amp;gt;元素可以包含不止一个强制协商特性. 这意味着发起方实体能在流协商过程的这个阶段中对强制协商特性进行选择. 举例来说, 可能一个将来的技术将执行和TLS一样的功能, 所以接收方实体可能在这次流协商过程中的同一个阶段声明同时支持TLS和这个将来的技术. 无论如何, 这只适用于流协商过程中的给定阶段而不适用于不同阶段的强制协商特性 (例如, 接收方实体不会声明同时支持STARTTLS和SASL作为强制性协商, 或同时声明SASL和资源绑定为强制协商, 因为TLS需要在SASL之前协商并且SASL需要在资源绑定之前协商). &lt;br /&gt;
&lt;br /&gt;
一个同时包含强制协商和自愿协商特性的&amp;lt;features/&amp;gt;元素指示协商未完成并且发起方实体可以在它尝试协商强制协商特性之前完成自愿协商特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个只包含自愿协商特性的的&amp;lt;features/&amp;gt;元素指示流协商未完成并且发起方实体可以开始发送XML节了, 但是如果发起方实体愿意可以协商更多特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个空的&amp;lt;features/&amp;gt;元素指示流协商已经完成并且发起方实体可以开始发送XML节. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
一个需要流重启的特性要成功地进行协商, 双方都必须确认前一个流被取代了但是必须不发送一个关闭的&amp;lt;/stream&amp;gt;标签并且必须不能终止底层的TCP连接; 反之, 双方必须重用现有的连接, 它可以是一个新的状态(例如, 作为一个TLS协商的的结果被加密). 然后发起方实体必须发送一个新的发起流头, 它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述. 当接收方实体接收到新的发起流头, 它必须在发送一个新的应答流头(它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述）之前生成一个新的流ID(而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
====重发特性====&lt;br /&gt;
&lt;br /&gt;
接收方实体必须在一个流重启之后发送一个流特性的更新列表给发起方实体. 如果没有更多的特性要被声明，这个更新的流特性列表可以是空的，这个列表也也可以包含任何特性的组合.&lt;br /&gt;
&lt;br /&gt;
====完成流协商====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个空的&amp;lt;features/&amp;gt;元素或只包含自愿协商特性的&amp;lt;features/&amp;gt;元素来表明流协商过程的完成. 这样做之后, 接收方实体可以发送一个空的&amp;lt;features/&amp;gt; 元素(例如, 在这些自愿协商特性协商完成之后) 但是必须不能发送额外的流特性给发起方实体(如果接收方实体有新的特性提供, 最好仅限于强制协商或安全关键的特性, 它可以简单地以一个&amp;lt;reset/&amp;gt;流错误( [[RFC6120#reset|4.9.3.16]] )来关闭流并且等发起方重新连接的时候声明新的特性, 最好以一个交错的方法来关闭现有的流，这样不会让所有的发起方同时进行重连). 一旦流协商完成, 发起方就可以一直通过这个流来发送XML节，只要双方都维持着这个流.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 在下面 [[RFC6120#资源绑定|第7章]] 定义的资源绑定是一个前述规则的一个历史性的例外, 因为对于客户端来说它是强制协商的但使用XML节来达成协商.&lt;br /&gt;
&lt;br /&gt;
在流协商完成之前，发起方实体不能(MUST NOT)尝试发送 [[RFC6120#XML节|XML节]] 给非自身的实体(也就是是说, 客户端的已连接资源或客户端帐号的任何其他已验证的资源) 或给它连接的服务器. 即使发起方尝试这么做, 接收方实体也不能(MUST NOT)接受这些节并且必须以一个&amp;lt;not-authorized/&amp;gt;流错误( [[RFC6120#未授权|4.9.3.12]] )来关闭流. 这个规则只适用于XML节(也就是说, 由内容命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 元素) 而不是用于流协商的XML元素(例如, 完成 [[RFC6120#STARTTLS协商|TLS协商]] 或 [[RFC6120#SASL协商|SASL协商]] 的元素).&lt;br /&gt;
&lt;br /&gt;
====确定地址====&lt;br /&gt;
&lt;br /&gt;
在一个XML流的双方已经完成了流协商的适当步骤之后, 流的接收方实体必须确定发起方实体的JID. &lt;br /&gt;
&lt;br /&gt;
对于客户端-服务器的通讯, 在服务器能确定客户端的地址之前，[[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] 必须完成. 客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;) 必须是授权身份 (如 [[RFC6120#常规引用|SASL]] 所定义的, 要么 (1) 是 [[RFC6120#SASL协商|SASL协商]] 期间客户端直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从服务器的验证身份指定的. 全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)的资源部分(resourcepart)必须是客户端和服务器在 [[RFC6120#资源绑定|资源绑定]] 期间协商得来的那个资源. 客户端必须不去尝试猜测它的JID而是必须相信在资源绑定期间服务器返回给它的JID. 服务器必须确保返回的这个JID (包含 本地部分(localpart), 域部分(domainpart), 资源部分(resourcepart), 以及分隔符) 遵循定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 的XMPP地址规范格式; 为了满足这个限定, 服务器可以把客户端的发来的JID替换成服务器确定的规范JID并在资源绑定期间使用那个JID来和客户端通讯.&lt;br /&gt;
&lt;br /&gt;
对于服务器-服务器通讯, 发起方服务器的纯JID (&amp;lt;domainpart&amp;gt;) 必须是授权的身份 (定义于 [[RFC6120#常规引用|SASL]] ), 要么 (1) 是[[RFC6120#SASL协商|SASL协商]] 期间发起方服务器直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从接收方服务器的验证身份指定的. 在缺少SASL协商的情况下, 接收方服务器可以认为授权身份是一个和相关确认协议协商的身份(例如, 在 服务器回拨[[RFC6120#常规引用|XEP‑0220]] 中 &amp;lt;result/&amp;gt; 元素的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 因为可能会有第三方在一个安全层例如TLS成功协商之前篡改流上发送的数据, 建议接收服务器谨慎对待这些未得到保护的信息; 这特别适用于由发起方实体发送的第一个发起流头中的'from'和'to'地址.&lt;br /&gt;
&lt;br /&gt;
====流程图====&lt;br /&gt;
&lt;br /&gt;
我们在接下来的非规范性的流程图里为流协商过程总结前述的规则, 以发起方实体的视角来展示. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                | 打开的TCP连接         |&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                           |&lt;br /&gt;
                           v&lt;br /&gt;
                    +---------------+&lt;br /&gt;
                    | 发送发起流头    |&amp;lt;-------------------------+&lt;br /&gt;
                    |               |                          ^&lt;br /&gt;
                    +---------------+                          |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                   | 接收应答流头       |                        |&lt;br /&gt;
                   |                  |                        |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                    +----------------+                         |&lt;br /&gt;
                    | 接收流特性       |                         |&lt;br /&gt;
+------------------&amp;gt;|                |                         |&lt;br /&gt;
^   {可选的}         +----------------+                         |&lt;br /&gt;
|                          |                                   |&lt;br /&gt;
|                          v                                   |&lt;br /&gt;
|       +&amp;lt;-----------------+                                   |&lt;br /&gt;
|       |                                                      |&lt;br /&gt;
|    {空?     ----&amp;gt; {全部自愿?       } ----&amp;gt; {一些强制性?      }   |&lt;br /&gt;
|       |      否          |          否         |             |&lt;br /&gt;
|       | 是               | 是                  | 是           |&lt;br /&gt;
|       |                  v                     v             |&lt;br /&gt;
|       |           +---------------+    +----------------+    |&lt;br /&gt;
|       |           | 可以协商或不协商 |    | 必须协商一个特性  |    |&lt;br /&gt;
|       |           | 任何一个       |    |                |    |&lt;br /&gt;
|       |           +---------------+    +----------------+    |&lt;br /&gt;
|       v                  |                     |             |&lt;br /&gt;
|   +---------+            v                     |             |&lt;br /&gt;
|   |  完成   |&amp;lt;----- {协商?      }               |             |&lt;br /&gt;
|   +---------+   否       |                     |             |&lt;br /&gt;
|                     是   |                     |             |&lt;br /&gt;
|                          v                     v             |&lt;br /&gt;
|                          +---------&amp;gt;+&amp;lt;---------+             |&lt;br /&gt;
|                                     |                        |&lt;br /&gt;
|                                     v                        |&lt;br /&gt;
+&amp;lt;-------------------------- {强制性重新开始?      } ------------&amp;gt;+&lt;br /&gt;
               否                                        是&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::::::'''图表3: 流协商流程图'''&lt;br /&gt;
&lt;br /&gt;
===关闭流===&lt;br /&gt;
&lt;br /&gt;
从一个实体到另一个实体的XML流可以在任何时候关闭, 可以是因为发生了一个特定的流错误 ([[RFC6120#流错误|4.9章]])) 也可以没有任何错误(例如, 当客户端简答地结束它的会话). &lt;br /&gt;
&lt;br /&gt;
一个通过发送关闭&amp;lt;/stream&amp;gt;标签来关闭的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
E: &amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果双方通过一个TCP连接使用两个流或通过两个TCP连接使用；两个流, 发送关闭流标签的实体必须按以下步骤进行:&lt;br /&gt;
&lt;br /&gt;
# 在终止底层的TCP连接之前等待另一方也关闭它的出站流; 这给另一方一个机会在终止TCP连接之前完成任何到正在关闭的实体的出站数据的传输.&lt;br /&gt;
# 避免通过它的出站流发送任何更多的数据到另一方, 但是继续处理从另一方实体已经接收到的数据(并且, 如果必要, 处理这些数据).&lt;br /&gt;
# 如果另一方没有在一个合理的时间(这里 &amp;quot;合理&amp;quot; 的定义取决于实现或布署)内发送它的关闭流标签则认为两个流都失效了.&lt;br /&gt;
# 从另一方接收到一个反向的关闭流标签或或在等待一段合理的时间之后未收到应答之后, 终止底层的TCP连接.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 根据 [[RFC6120#常规引用|TLS]] 的7.2.1章节, 为了帮助防止截断攻击，正在关闭流的那一方在终止底层TCP连接之前必须发送一个 TLS close_notify 提醒并且从另一方接收到应答的 close_notify 提醒.&lt;br /&gt;
&lt;br /&gt;
如果双方通过多重TCP连接使用多重流, 没有已定义的配对流并且因此其行为取决于实现.&lt;br /&gt;
&lt;br /&gt;
===方向性===&lt;br /&gt;
===无响应对端的处理===&lt;br /&gt;
====死连接====&lt;br /&gt;
====中断的流====&lt;br /&gt;
====空闲对端====&lt;br /&gt;
====检查方法的使用====&lt;br /&gt;
===流属性===&lt;br /&gt;
====from====&lt;br /&gt;
====to====&lt;br /&gt;
====id====&lt;br /&gt;
====xml:lang====&lt;br /&gt;
====version====&lt;br /&gt;
====流属性总结====&lt;br /&gt;
===XML命名空间===&lt;br /&gt;
====流命名空间====&lt;br /&gt;
====内容命名空间====&lt;br /&gt;
====XMPP内容命名空间====&lt;br /&gt;
====其他命名空间====&lt;br /&gt;
====命名空间声明和前缀====&lt;br /&gt;
===流错误===&lt;br /&gt;
====规则====&lt;br /&gt;
=====流错误是不可恢复的=====&lt;br /&gt;
=====流错误可能发生在安装过程中=====&lt;br /&gt;
=====当主机未定义或未知时会发生流错误=====&lt;br /&gt;
=====流错误发到哪=====&lt;br /&gt;
====语法====&lt;br /&gt;
====已定义的流错误条件====&lt;br /&gt;
=====bad-format=====&lt;br /&gt;
=====bad-namespace-prefix=====&lt;br /&gt;
=====conflict=====&lt;br /&gt;
=====connection-timeout=====&lt;br /&gt;
=====host-gone=====&lt;br /&gt;
=====host-unknown=====&lt;br /&gt;
=====improper-addressing=====&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
=====invalid-from=====&lt;br /&gt;
=====invalid-namespace=====&lt;br /&gt;
=====invalid-xml=====&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
=====not-well-formed=====&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
=====remote-connection-failed=====&lt;br /&gt;
=====reset=====&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
=====restricted-xml=====&lt;br /&gt;
=====see-other-host=====&lt;br /&gt;
=====system-shutdown=====&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
=====unsupported-encoding=====&lt;br /&gt;
=====unsupported-feature=====&lt;br /&gt;
=====unsupported-stanza-type=====&lt;br /&gt;
=====unsupported-version=====&lt;br /&gt;
====应用定义的条件====&lt;br /&gt;
===简化的流示例===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2011-12-26T05:17:20Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 流程图 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权通知'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个留上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#关键字|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#IRI|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#UNICODE|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这种形式是绝对不会在XMPP系统将通过网络发送的.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; 本文或常用参考文档中的协议规范所用到的所有用例里面提供的例子都遵从上述规则. 所有例子都是虚构的并且交换的信息 (例如, 用户名和密码) 不代表任何现存的用户和服务器.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
&lt;br /&gt;
XMPP提供一种异步的端到端的结构化数据交换技术，在一个分布式的可全球寻址和出席信息感知的客户端和服务器的网络中使用直接的持久XML流。这种体系结构形式包含了普遍的网络可用性的知识，以及在给定的客户端-服务器和服务器-服务器会话的时候，不限数量的并发信息交易的概念，所以我们把它称为 &amp;quot;并发交易可用性&amp;quot; (&amp;quot;Availability for Concurrent Transactions&amp;quot;) (简称ACT) 来把它和来自WWW的 &amp;quot;Representational State Transfer&amp;quot; [[RFC6120#REST|REST]] 体系结构形式区别开. 尽管XMPP的体系结构很大程度上类似于 email (参见 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]], 它引入了一些变化以便于准实时通讯.  ACT体系结构形式的独特特性如下. &lt;br /&gt;
&lt;br /&gt;
===全局地址===&lt;br /&gt;
&lt;br /&gt;
和email一样, 为了通过网络路由和递送消息,XMPP使用全球唯一地址(基于DNS). 所有XMPP实体可以在网络上被寻址, 大部分客户端和服务器以及很多外部服务可以被客户端和服务器访问. 通常, 服务器地址的格式为 &amp;lt;域部分&amp;gt; (例如, &amp;lt;im.example.com&amp;gt;), 属于某台服务器的帐号的格式为 &amp;lt;本地部分@域部分&amp;gt; (例如, &amp;lt;juliet@im.example.com&amp;gt;, 称为 &amp;quot;纯JID&amp;quot;), 而连接到一个特定的设备或资源并且已经被(服务器)授权可以和外部交互的客户端的格式为 &amp;lt;本地部分@域部分/资源部分&amp;gt; (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt;, 称为 &amp;quot;全JID&amp;quot;). 因为历史原因, XMPP地址常被称为Jabber IDs 或 JIDs. 因为XMPP地址格式的正式规范依赖于国际化技术（本文撰写时正在制定中），这个格式定义于 [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] 而非本文之中. 术语 &amp;quot;localpart&amp;quot;(本地部分), &amp;quot;domainpart&amp;quot;（域部分）, 和 &amp;quot;resourcepart&amp;quot;（资源部分） 正式定义于  [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] .&lt;br /&gt;
&lt;br /&gt;
===出席信息===&lt;br /&gt;
&lt;br /&gt;
XMPP让一个实体能够向其他实体声明它的网络可用性或者 &amp;quot;presence&amp;quot;（出席信息） . 在XMPP中, 这种可通讯状态是用端到端的专用通讯元素来标识的: 即 &amp;lt;presence/&amp;gt; 节. 尽管网络可用性对于XMPP消息交换并不是必需的, 它还是可以促进实时交互，因为消息发起者可以在发消息之前知道接收者在线并处于可通讯状态. 端到端的出席信息定义于 [[RFC6120#XMPP‑IM|XMPP‑IM]] .&lt;br /&gt;
&lt;br /&gt;
===持久流===&lt;br /&gt;
&lt;br /&gt;
每个点对点的一&amp;quot;跳&amp;quot;都建立了基于TCP长连接的持久XML流来保持可通讯状态. 这些 &amp;quot;always-on&amp;quot; 客户端-服务器 和 服务器-服务器 流使得任何时间每方都能够推送数据到另一方并且立即路由和递送. XML流定义于 [[RFC6120#XML流|4]] .&lt;br /&gt;
&lt;br /&gt;
===结构化数据===&lt;br /&gt;
&lt;br /&gt;
XMPP中基本的协议数据单元不是一个XML流 (它只是为点对点通讯提供传输层) 而是一个 XML 节（&amp;quot;stanza&amp;quot;), 它是一个通过流发送的XML片段. 一个节的根元素包括路由属性 (类似 &amp;quot;from&amp;quot; 和 &amp;quot;to&amp;quot; 地址), 而节的子元素包含了递送给目标接收者的载荷. XML节定义于 [[RFC6120#XML节|8]] .&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;br /&gt;
&lt;br /&gt;
在实践之中, XMPP是一个包含了很多互相通讯的客户端和服务器的网络(当然, 任何两个给定的布署服务器之间的通讯都是严格谨慎的并且也和本地服务策略有关). 因此, 例如, 与服务器 &amp;lt;im.example.com&amp;gt; 关联的用户 &amp;lt;juliet@im.example.com&amp;gt; 能够和服务器 &amp;lt;example.net&amp;gt; 关联的用户 &amp;lt;romeo@example.net&amp;gt; 交换消息，出席信息和其他结构化数据. 这个模式对使用全局地址的消息协议是很常见的, 例如email网络 (见 [[RFC6120#SMTP|SMTP]] 和 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]] . 结果, 在XMPP中端到端的通讯是逻辑上的点对点，而物理结构则是 客户端-服务器-服务器-客户端, 如下图所示. &lt;br /&gt;
&lt;br /&gt;
'''图1: 分布式客户端-服务器 体系结构'''&lt;br /&gt;
&lt;br /&gt;
  example.net &amp;lt;--------------&amp;gt; im.example.com&lt;br /&gt;
      ^                                ^&lt;br /&gt;
      |                                |&lt;br /&gt;
      v                                v&lt;br /&gt;
 romeo@example.net           juliet@im.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 体系结构使用 [[RFC6120#XML流|XML流]] 和 [[RFC6120#XML节|XML节]] ，但是两个客户端之间直接建立端到端的连接则使用基于 [[RFC6120#LINKLOCAL|LINKLOCAL]] 的技术, 不过那个体系结构没有定义在本协议之中，它只能说是 &amp;quot;类XMPP&amp;quot;; 详见 [[RFC6120#XEP‑0174|XEP‑0174]] . 另外, XML流可以在任何可靠的传输层上简历端到端的连接, 包括XMPP本真的扩展; 无论如何, 这些方法没有包含在本文之中.&lt;br /&gt;
&lt;br /&gt;
以下段落描述客户端和服务器们各自在网络中负责什么.&lt;br /&gt;
&lt;br /&gt;
一个客户端就是一个实体，它先和它的注册帐号所在服务器建立XML流 (通过 [[RFC6120#SASL握手|SASL握手]] ) , 然后完成 [[RFC6120#资源绑定|资源绑定]] , 这样就能通过建好的流在客户端和服务器之间递送XML节. 客户端使用 XMPP 来和它的服务器, 其他客户端以及任何其他网络上的实体通讯, 这里服务器负责递送节到同一台服务器上其他已连接的客户端，或把它们路由到远程服务器上. 一个服务器上的注册帐号可以同时使用多个客户端连接到一台服务器上, 这里每个客户端的XMPP地址的 ''资源部分'' 是不同的 (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;), 定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 和 [[RFC6120#资源绑定|7]]&lt;br /&gt;
&lt;br /&gt;
一个服务器是一个实体，主要负责以下事项: &lt;br /&gt;
&lt;br /&gt;
:* 管理已连接客户端的 [[RFC6120#XML流|XML流]] 并通过建好的流递送 [[RFC6120#XML节|XML节]] 到那些通过客户端; 这也包括负责确保客户端在被授权访问XMPP网络之前的客户端身份验证工作.&lt;br /&gt;
:* 遵循本地服务对服务器之间通讯的策略, 管理和远程服务器之间的 [[RFC6120#XML流|XML流]] 并通过建好的流路由 [[RFC6120#XML节|XML节]] 到那些服务器.&lt;br /&gt;
&lt;br /&gt;
取决于服务器的不同, 一个XMPP服务器的次要责任可能包括: &lt;br /&gt;
&lt;br /&gt;
:* 存储客户端使用的数据 (例如, 用户的基于 [[RFC6120#常规引用|XMPP-IM]] 的联系人; 在这种情况下, 相关的XML节直接由服务器本身代替客户端来处理而不用路由到远程服务器或递送到一个已连接的客户端.&lt;br /&gt;
:* 托管的额外服务也使用XMPP作为通讯的基础，但是提供超出本文范围的额外的或 [[RFC6120#常规引用|XMPP-IM]] 定义的功能; 例子包括多用户会议服务(定义于 [[RFC6120#常规引用|XEP‑0045]] ) 和 发布-订阅 服务 (定义于 [[RFC6120#常规引用|XEP‑0060]] ).&lt;br /&gt;
&lt;br /&gt;
==TCP绑定==&lt;br /&gt;
===范围===&lt;br /&gt;
&lt;br /&gt;
如本文定义的XMPP所述, 一个发起方实体在 (客户端或服务器) 和接收方实体协商XML流之前必须(MUST) 打开一个到接收方实体 (服务器) 的 [[RFC6120#常规引用|TCP]] 连接. 然后在使用XML流期间双方一直保持那个TCP连接. 这个规则在下面章节中的TCP绑定要用到.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 不一定要把XML流建立在TCP上, 其他传输协议也是可以的. 例如, 两个实体可以通过 [[RFC6120#提示性引用|HTTP]] 互相连接（定义于 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] . 无论如何, 本协议只定义把XMPP绑定到TCP.&lt;br /&gt;
&lt;br /&gt;
===合格的全域名解析===&lt;br /&gt;
&lt;br /&gt;
因为XML流是是通过TCP发送的, 发起方实体在尝试打开一个XML流之前需要确定接收方实体的IPv4或IPv6地址(以及端口). 一般来说这是通过解析接收方实体的合格的全域名(简称FQDN,参见 [[RFC6120#常规引用|DNS概念]] )来实现的. &lt;br /&gt;
&lt;br /&gt;
====首选流程:SRV查询====&lt;br /&gt;
&lt;br /&gt;
FQDN解析的首选流程是如下使用 [[RFC6120#常规引用|DNS‑SRV]] 记录: &lt;br /&gt;
&lt;br /&gt;
# 发起方实体构造一个 DNS SRV 查询，参数如下:&lt;br /&gt;
## 一个 &amp;quot;xmpp-client&amp;quot; (用于 客户端-服务器 连接) 或 &amp;quot;xmpp-server&amp;quot; (用于 服务器-服务器 连接)服务&lt;br /&gt;
## 一个 &amp;quot;tcp&amp;quot; 协议&lt;br /&gt;
## 一个对应发起方实体希望连接的XMPP服务的 &amp;quot;原有域&amp;quot;（ [[RFC6120#常规引用|TLS‑CERTS]] ）的名字 (例如, &amp;quot;example.net&amp;quot; 或 &amp;quot;im.example.com&amp;quot;)&lt;br /&gt;
# 得到一个类似 &amp;quot;_xmpp-client._tcp.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.im.example.com.&amp;quot; 的查询.&lt;br /&gt;
# 如果收到应答, 它将包含一个或多个FDQN和端口的组合, 每个都拥有权重和优先级 (如 [[RFC6120#常规引用|DNS‑SRV]] 所述). (无论如何, 如果SRV查询的结果是一个单独的资源记录 &amp;quot;.&amp;quot;, 即根域名, 那么发起方实体必须(MUST)在这时终止SRV处理，因为根据 [[RFC6120#常规引用|DNS‑SRV]] ,这样一个结果意味着那个服务在本域中是不可用的)&lt;br /&gt;
# 发起方实体至少选择返回的FQDNs记录中的一个来解决 (根据 [[RFC6120#常规引用|DNS‑SRV]] 规则,对FDQN执行 DNS &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 查询; 这将返回一个 IPv4 或 IPv6 的地址.&lt;br /&gt;
# 成功解析FDQN(包括SRV查询返回的相应的端口号)之后,发起方实体就使用IP地址来连接接收方实体.&lt;br /&gt;
# 如果发起方实体使用那个IP地址连接失败，而的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 记录查询返回了不止一个IP地址, 那么发起方实体使用那个FDQN的下一个解析好的IP地址作为连接地址.&lt;br /&gt;
# 如果发起方实体用给定的FDQN的所有解析出来的IP地址都无法连接, 那么它重复解析过程并使用基于优先级和权重的SRV查询(定义于 [[RFC6120#常规引用|DNS SRV]] )返回的下一个FQDN来连接.&lt;br /&gt;
# 如果发起方实体接收到它的SRV应答但是无法使用接收到的应答数据来建立一个XMPP连接, 它不应该(SHOULD NOT)尝试下面描述的备用流程(这有助于防止入站和出站连接状态不匹配).&lt;br /&gt;
# 如果发起方实体不能从它的SRV查询接收到应答, 它应该(SHOULD)尝试下一节描述的备用流程.&lt;br /&gt;
&lt;br /&gt;
====后备流程====&lt;br /&gt;
&lt;br /&gt;
后备流程应该(SHOULD)是一个常规的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 地址记录解析以决定原始域的IPv4或IPv6地址, 而端口则为 &amp;quot;xmpp-client&amp;quot; 端口(5222)用于客户端-服务器连接或 &amp;quot;xmpp-server&amp;quot; 端口(5269)用于服务器-服务器连接 (这些是在IANA注册的缺省端口，[[RFC6120#端口号和服务名|14.7]] .&lt;br /&gt;
&lt;br /&gt;
如果通过TCP连接不成功, 发起方实体可能尝试找到并使用替代连接方法例如HTTP绑定 (见 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] , 它可能使用 [[RFC6120#提示性引用|DNS‑TXT]] 记录(参见 [[RFC6120#提示性引用|XEP‑0156]]) 来搜索.&lt;br /&gt;
&lt;br /&gt;
====什么时候不用SRV====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体已经被显式地配置为一个关联到接收实体的原始域的一个特定的FQDN (以及潜在的端口) (比如,一个特定的原始域 example.net  &amp;quot;写死&amp;quot; 到一个配置好的 apps.example.com 的 FQDN), 鼓励初始方实体使用配置好的名字而不是建议的对原始域的SRV解析流程.&lt;br /&gt;
&lt;br /&gt;
====附加服务使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
很多XMPP服务器以可托管附加服务 (超出本文和 [[RFC6120#常规引用|XMPP-IM]] 定义范围) 这种方式来实现，附加服务的DNS域名典型的形式是主XMPP服务的 &amp;quot;子域名&amp;quot; (例如, conference.example.net 用于 [[RFC6120#常规引用|XEP‑0045]] 服务,相关的XMPP主服务为 example.net ) 或 底层服务的一级域名的 &amp;quot;子域名&amp;quot; (例如, muc.example.com 用于 [[RFC6120#常规引用|XEP‑0045]] 服务，相关的XMPP主服务为 im.example.com ). 如果一个和远程XMPP服务关联的实体希望连接到这样一个附加服务上, 它将生成一个适当的XML节，而远程服务器将尝试通过一个SRV查询资源记录类似 &amp;quot;_xmpp-server._tcp.conference.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.muc.example.com.&amp;quot; 来解析该附加服务的DNS域名. 所以, 如果一个XMPP服务的管理员希望让远程服务器相关的实体能访问这样的附加服务, 除了用于他们的主XMPP服务的 &amp;quot;_xmpp-server&amp;quot; 记录之外, 他们还需要声明适当的 &amp;quot;_xmpp-server&amp;quot; SRV 记录. 当 SRV 记录不可用的时候, 可使用后备方法 [[RFC6120#后备流程|3.2.2]] 来为附加服务解析域名.&lt;br /&gt;
&lt;br /&gt;
===重连===&lt;br /&gt;
&lt;br /&gt;
XMPP服务器可能在会向连接的客户端和远端服务器提供TCP连接服务的时候意外掉线. 因为这些连接的数量可能非常大, 实体的重连机制寻求解决重连可能导致的对软件性能的冲剂和网络堵塞. 如果实体选择重连, 它: &lt;br /&gt;
&lt;br /&gt;
:* 应该把重连之前等待的秒数设置为0到60之间 (这有助于确保不会所有实体在掉线的同一个时间间隔之后同时尝试重连).&lt;br /&gt;
:* 如果第一次尝试重连没有成功则随后的尝试重连的时间间隔应该越来越长 (例如, 按照 [[RFC6120#提示性引用|ETHERNET]] 描述的 &amp;quot;动态二进制指数后退算法&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
建议重连的时候使用TLS会话恢复 [[RFC6120#提示性引用|TLS‑RESUME]] . 本文未来的某个版本, 或某个独立的协议, 可能会提供更多详细的关于加速重连过程的方法的指南.&lt;br /&gt;
&lt;br /&gt;
===可靠性===&lt;br /&gt;
&lt;br /&gt;
在XMPP使用常连的TCP连接意味着通过XML流发送的XML节可能不可靠, 因为长连的TCP的各方可能无法及时地了解掉线情况. 在XMPP应用层, 长连接掉线可能导致无法发送节. 尽管本文定义的核心XMPP技术未包括克服这一可靠性缺陷的特性, 有一个XMPP扩展在做这件事 (例如, [[RFC6120#提示性引用|XEP‑0198]] ).&lt;br /&gt;
&lt;br /&gt;
==XML流==&lt;br /&gt;
===流基础===&lt;br /&gt;
&lt;br /&gt;
两个基本概念，使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换：XML流和XML节。这些术语的定义如下。&lt;br /&gt;
&lt;br /&gt;
:XML流的定义:&lt;br /&gt;
::XML流是一个容器，用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 &amp;quot;流头&amp;quot; (即, 一个包含了适当树形和命名空间声明的 XML &amp;lt;stream&amp;gt; 标签), 而这个XML流的结尾明确表达为一个关闭的XML &amp;lt;/stream&amp;gt; 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 [[RFC6120#提示性引用|TLS协商]] 或 [[RFC6120#提示性引用|SASL协商]] ) 或用于 XML节. &amp;quot;发起流&amp;quot; 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 &amp;quot;连接到&amp;quot; 或 &amp;quot;和......开启会话&amp;quot; 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 (&amp;quot;应答流&amp;quot;).&lt;br /&gt;
:XML节的定义:&lt;br /&gt;
::XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1)，它的元素名是 &amp;quot;message&amp;quot;, &amp;quot;presence&amp;quot;, 或 &amp;quot;iq&amp;quot; ，而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素但不在第一层 (例如, 包含在一个扩展元素中的 &amp;lt;message/&amp;gt; 元素 ( 做报告用的 [[RFC6120#扩展内容|8.4]] )也不是一个XML节, 不是命名空间 'jabber:client' 或 'jabber:server'限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 [[RFC6120#常规引用|XML‑NAMES]] 和本协议的 [[RFC6120#扩展内容|8.4]]).&lt;br /&gt;
&lt;br /&gt;
有三种节: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的缩写). 这些节类型提供三种不同的通讯原语: 一个 &amp;quot;推送&amp;quot; 机制用于已生成的消息, 一个特定的 &amp;quot;发行-订阅&amp;quot; 机制用于广播网络可用性信息, 和一个 &amp;quot;请求-应答&amp;quot; 机制用于更结构化的数据交换 (类似 [[RFC6120#提示性引用|HTTP]] . 更多解释分别位于 [[RFC6120#Messsage语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] . &lt;br /&gt;
&lt;br /&gt;
考虑一个客户端连接到一个服务器的例子. 客户端通过发送一个流头来发起一个XML流到服务器, 最好在前面加上一个XML声明来指定XML版本和支持的字符串编码 (见 [[RFC6120#包含XML声明|11.5]] 和 [[RFC6120#字符串编码|11.6]] ). 遵循本地策略和服务设置, 该服务器接着以第二个XML流应答回客户端, 最好再次在前面加上一个XML声明. 一旦客户端完成 [[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] , 该客户端就能通过这个流来发送不限数量的XML节. 当客户端想要关闭这个流的时候, 它只要简单的发送一个关闭 &amp;lt;/stream&amp;gt; 标签给服务器，如 [[RFC6120#关闭流|4.4]] . &lt;br /&gt;
&lt;br /&gt;
基本上, 接着, 一个XML流功能作为会话期间发送的XML节的信封而另一个XML流功能作为会话期间接收的XML节的信封. 我们可以如下做一个简单的展示. &lt;br /&gt;
&lt;br /&gt;
'''图2: 两个流的简单视图'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| INITIAL STREAM     |  RESPONSE STREAM   |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| &amp;lt;stream&amp;gt;           |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;stream&amp;gt;           |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;presence&amp;gt;         |                    |&lt;br /&gt;
|   &amp;lt;show/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/presence&amp;gt;        |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;message to='foo'&amp;gt; |                    |&lt;br /&gt;
|   &amp;lt;body/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/message&amp;gt;         |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;iq to='bar'       |                    |&lt;br /&gt;
|     type='get'&amp;gt;    |                    |&lt;br /&gt;
|   &amp;lt;query/&amp;gt;         |                    |&lt;br /&gt;
| &amp;lt;/iq&amp;gt;              |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;iq from='bar'     |&lt;br /&gt;
|                    |     type='result'&amp;gt; |&lt;br /&gt;
|                    |   &amp;lt;query/&amp;gt;         |&lt;br /&gt;
|                    | &amp;lt;/iq&amp;gt;              |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| [ ... ]            |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | [ ... ]            |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;/stream&amp;gt;          |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;/stream&amp;gt;          |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那些习惯于把XML当成一个文档中心的方式的人可能会发现下面的类比是有益的: &lt;br /&gt;
&lt;br /&gt;
:* 两个XML流像两个 &amp;quot;文档&amp;quot; (相当于 [[RFC6120#常规引用|XML]] 的&amp;quot;文档&amp;quot; 产生)，它们是通过积累XML节来建立的.&lt;br /&gt;
:* 根 &amp;lt;stream/&amp;gt; 元素像每个 &amp;quot;文档&amp;quot; 的 &amp;quot;文档实体&amp;quot; (详见 [[RFC6120#常规引用|XML]] 的4.8章).&lt;br /&gt;
:* 通过流发送的XML节像该 &amp;quot;文档&amp;quot;的 &amp;quot;片段&amp;quot; (详见 [[RFC6120#提示性引用|XML‑FRAG]] ).&lt;br /&gt;
&lt;br /&gt;
无论如何, 这些描述只是类比, 因为XMPP不处理文档和片段而是处理流和节. &lt;br /&gt;
&lt;br /&gt;
本节的其余部分定义XML流（连同相关主题）的以下几个方面：&lt;br /&gt;
&lt;br /&gt;
:* 如何打开流 ( [[RFC6120#打开流|4.2]] )&lt;br /&gt;
:* 流协商过程 ( [[RFC6120#流协商|4.3]] )&lt;br /&gt;
:* 如何关闭流 ( [[RFC6120#关闭流|4.4]] )&lt;br /&gt;
:* XML流的方向性 ( [[RFC6120#方向性|4.5]] )&lt;br /&gt;
:* 如何处理沉默的对端 ( [[RFC6120#处理沉默对端|4.6]] )&lt;br /&gt;
:* 流的XML属性 ( [[RFC6120#流属性|4.7]] )&lt;br /&gt;
:* 流的XML命名空间 ( [[RFC6120#流命名空间|4.8]] )&lt;br /&gt;
:* 和XML流相关的错误处理 ( [[RFC6120#流错误|4.9]] )&lt;br /&gt;
&lt;br /&gt;
===打开流===&lt;br /&gt;
&lt;br /&gt;
连接到接收方实体的适当的IP地址和端口之后, 发起方实体通过发送一个流头 (&amp;quot;发起流头&amp;quot;) 来打开到接收方实体的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后接收方实体通过发送一个它自己的流头 (&amp;quot;应答流头&amp;quot;) 来回复发起方实体. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着实体们就可以在进行流协商过程的其他步骤了.&lt;br /&gt;
&lt;br /&gt;
===流协商===&lt;br /&gt;
====基本概念====&lt;br /&gt;
&lt;br /&gt;
因为流的接收方实体可以说是它所服务的域的看门人, 它对客户端或对端服务器的发起的连接有一定的条件要求. 最低程度, 发起方实体在接收方实体被允许发送节之前需要验证接收方实体， (对客户-服务器流来说这意味着使用 [[RFC6120#SASL协商|6]] 中描述的SASL). 无论如何, 接收方实体可以考虑其他验证条件来强制协商, 例如使用 [[RFC6120#TLS协商|5]] 描述的TLS加密. 接收方实体通知发起方实体这些条件通过 &amp;quot;stream features&amp;quot;: 发起方需要在接收方接受它发送的XML节之前完成的一系列特别的协议交互, 以及任何自愿协商但是可以提高XML流处理的协议交互 (例如,  [[RFC6120#提示性引用|XEP‑0138]] 描述的建立应用层压缩). &lt;br /&gt;
&lt;br /&gt;
连接条件的存在意味着流需要协商. 层的顺序 ( [[RFC6120#层的顺序|13.3]] 描述的的TCP, 然后是TLS, 然后是SASL, 然后是XMPP) 意味着流协商是一个多级的过程. 进一步的结构由两个因素来施加: (1) 一个给定的流特性可以仅对特定的实体提供，或只在特定的其他特性已经被协商之后提供 (例如, 资源绑定仅在SASL验证之后提供), 和 (2) 流特性可能是强制协商也可能是自愿协商. 最后, 基于安全的原因一个流的参与者们在成功地完成用于特定特性的协议交互之后需要忘掉它们在协商过程中获得的知识 (例如, 在所有情况下的TLS和当可能建立一个安全层的情况下的SASL, 如有关SASL机制的规范所述). 使用刷新旧的流上下文和通过现有的TCP连接交换新的流头就可以做到这一点.&lt;br /&gt;
&lt;br /&gt;
====流特性格式====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体包含在发起流头里的 'version' 属性值设为不低于 &amp;quot;1.0&amp;quot; (见 [[RFC6120#版本|4.7.5]] ), 接收方实体在发送应答流头之后必须发送一个&amp;lt;features/&amp;gt; 子元素 (通常使用 [[RFC6120#命名空间声明和前缀|4.8.5]] 描述的流命名空间前缀作为前缀) 给发起方实体以声明使流协商过程继续下去的任何条件. 每个条件用 &amp;lt;features/&amp;gt; 元素的子元素的格式, 由一个不同于流命名空间和内容命名空间的命名空间来限定. &amp;lt;features/&amp;gt; 元素可以包含一个字元素，多个子元素，或者为空.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 包含在任何给定的&amp;lt;features/&amp;gt;元素的子元素的顺序不重要.&lt;br /&gt;
&lt;br /&gt;
如果一个特殊的流特性是或者可以是强制协商的, 那个特性的定义需要做以下几件事之一: &lt;br /&gt;
&lt;br /&gt;
:# 声明这个特性总是强制协商的 (例如, XMPP客户端的资源绑定就是这样的); 或&lt;br /&gt;
:# 为接收方实体指定一个方法来标记这个特性在这次交互中为强制协商 (例如, 对于 STARTTLS, 这是通过包含一个空的 &amp;lt;required/&amp;gt; 元素到流特性广告中来实现的, 但是对所有流特性的通用格式); 建议用于新的强制协商特性的流特性定义如 STARTTLS 所做的那样通过包含一个空的 &amp;lt;required/&amp;gt; 元素来实现.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 因为没有通用格式来说明一个特性是强制协商的, 有可能会出现一个发起方实体不能理解的特性而被接收方认为是强制协商的, 而导致流协商过程失败. 尽管这样一个结果是不可取的, 本工作组认为不需要通用格式的情况是很罕见的.&lt;br /&gt;
&lt;br /&gt;
基于安全性的原因, 对于必要的特定流特性，在该特性协商成功之后，发起方将发送一个新的发起流头 (例如, 任何情况下的TLS和当建立了安全层的情况下的SASL). 如果一个给定的流特性出现在这种情况下, 那个特性的定义需要指定该特性协商之后的流重启. &lt;br /&gt;
&lt;br /&gt;
一个包含至少一个强制协商特性的&amp;lt;features/&amp;gt;元素标识流协商没有完成并且发起方实体必须协商更多的特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个&amp;lt;features/&amp;gt;元素可以包含不止一个强制协商特性. 这意味着发起方实体能在流协商过程的这个阶段中对强制协商特性进行选择. 举例来说, 可能一个将来的技术将执行和TLS一样的功能, 所以接收方实体可能在这次流协商过程中的同一个阶段声明同时支持TLS和这个将来的技术. 无论如何, 这只适用于流协商过程中的给定阶段而不适用于不同阶段的强制协商特性 (例如, 接收方实体不会声明同时支持STARTTLS和SASL作为强制性协商, 或同时声明SASL和资源绑定为强制协商, 因为TLS需要在SASL之前协商并且SASL需要在资源绑定之前协商). &lt;br /&gt;
&lt;br /&gt;
一个同时包含强制协商和自愿协商特性的&amp;lt;features/&amp;gt;元素指示协商未完成并且发起方实体可以在它尝试协商强制协商特性之前完成自愿协商特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个只包含自愿协商特性的的&amp;lt;features/&amp;gt;元素指示流协商未完成并且发起方实体可以开始发送XML节了, 但是如果发起方实体愿意可以协商更多特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个空的&amp;lt;features/&amp;gt;元素指示流协商已经完成并且发起方实体可以开始发送XML节. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
一个需要流重启的特性要成功地进行协商, 双方都必须确认前一个流被取代了但是必须不发送一个关闭的&amp;lt;/stream&amp;gt;标签并且必须不能终止底层的TCP连接; 反之, 双方必须重用现有的连接, 它可以是一个新的状态(例如, 作为一个TLS协商的的结果被加密). 然后发起方实体必须发送一个新的发起流头, 它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述. 当接收方实体接收到新的发起流头, 它必须在发送一个新的应答流头(它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述）之前生成一个新的流ID(而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
====重发特性====&lt;br /&gt;
&lt;br /&gt;
接收方实体必须在一个流重启之后发送一个流特性的更新列表给发起方实体. 如果没有更多的特性要被声明，这个更新的流特性列表可以是空的，这个列表也也可以包含任何特性的组合.&lt;br /&gt;
&lt;br /&gt;
====完成流协商====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个空的&amp;lt;features/&amp;gt;元素或只包含自愿协商特性的&amp;lt;features/&amp;gt;元素来表明流协商过程的完成. 这样做之后, 接收方实体可以发送一个空的&amp;lt;features/&amp;gt; 元素(例如, 在这些自愿协商特性协商完成之后) 但是必须不能发送额外的流特性给发起方实体(如果接收方实体有新的特性提供, 最好仅限于强制协商或安全关键的特性, 它可以简单地以一个&amp;lt;reset/&amp;gt;流错误( [[RFC6120#reset|4.9.3.16]] )来关闭流并且等发起方重新连接的时候声明新的特性, 最好以一个交错的方法来关闭现有的流，这样不会让所有的发起方同时进行重连). 一旦流协商完成, 发起方就可以一直通过这个流来发送XML节，只要双方都维持着这个流.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 在下面 [[RFC6120#资源绑定|第7章]] 定义的资源绑定是一个前述规则的一个历史性的例外, 因为对于客户端来说它是强制协商的但使用XML节来达成协商.&lt;br /&gt;
&lt;br /&gt;
在流协商完成之前，发起方实体不能(MUST NOT)尝试发送 [[RFC6120#XML节|XML节]] 给非自身的实体(也就是是说, 客户端的已连接资源或客户端帐号的任何其他已验证的资源) 或给它连接的服务器. 即使发起方尝试这么做, 接收方实体也不能(MUST NOT)接受这些节并且必须以一个&amp;lt;not-authorized/&amp;gt;流错误( [[RFC6120#未授权|4.9.3.12]] )来关闭流. 这个规则只适用于XML节(也就是说, 由内容命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 元素) 而不是用于流协商的XML元素(例如, 完成 [[RFC6120#STARTTLS协商|TLS协商]] 或 [[RFC6120#SASL协商|SASL协商]] 的元素).&lt;br /&gt;
&lt;br /&gt;
====确定地址====&lt;br /&gt;
&lt;br /&gt;
在一个XML流的双方已经完成了流协商的适当步骤之后, 流的接收方实体必须确定发起方实体的JID. &lt;br /&gt;
&lt;br /&gt;
对于客户端-服务器的通讯, 在服务器能确定客户端的地址之前，[[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] 必须完成. 客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;) 必须是授权身份 (如 [[RFC6120#常规引用|SASL]] 所定义的, 要么 (1) 是 [[RFC6120#SASL协商|SASL协商]] 期间客户端直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从服务器的验证身份指定的. 全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)的资源部分(resourcepart)必须是客户端和服务器在 [[RFC6120#资源绑定|资源绑定]] 期间协商得来的那个资源. 客户端必须不去尝试猜测它的JID而是必须相信在资源绑定期间服务器返回给它的JID. 服务器必须确保返回的这个JID (包含 本地部分(localpart), 域部分(domainpart), 资源部分(resourcepart), 以及分隔符) 遵循定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 的XMPP地址规范格式; 为了满足这个限定, 服务器可以把客户端的发来的JID替换成服务器确定的规范JID并在资源绑定期间使用那个JID来和客户端通讯.&lt;br /&gt;
&lt;br /&gt;
对于服务器-服务器通讯, 发起方服务器的纯JID (&amp;lt;domainpart&amp;gt;) 必须是授权的身份 (定义于 [[RFC6120#常规引用|SASL]] ), 要么 (1) 是[[RFC6120#SASL协商|SASL协商]] 期间发起方服务器直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从接收方服务器的验证身份指定的. 在缺少SASL协商的情况下, 接收方服务器可以认为授权身份是一个和相关确认协议协商的身份(例如, 在 服务器回拨[[RFC6120#常规引用|XEP‑0220]] 中 &amp;lt;result/&amp;gt; 元素的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 因为可能会有第三方在一个安全层例如TLS成功协商之前篡改流上发送的数据, 建议接收服务器谨慎对待这些未得到保护的信息; 这特别适用于由发起方实体发送的第一个发起流头中的'from'和'to'地址.&lt;br /&gt;
&lt;br /&gt;
====流程图====&lt;br /&gt;
&lt;br /&gt;
我们在接下来的非规范性的流程图里为流协商过程总结前述的规则, 以发起方实体的视角来展示. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                | 打开的TCP连接         |&lt;br /&gt;
                +---------------------+&lt;br /&gt;
                           |&lt;br /&gt;
                           v&lt;br /&gt;
                    +---------------+&lt;br /&gt;
                    | 发送发起流头    |&amp;lt;-------------------------+&lt;br /&gt;
                    |               |                          ^&lt;br /&gt;
                    +---------------+                          |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                   | 接收应答流头       |                        |&lt;br /&gt;
                   |                  |                        |&lt;br /&gt;
                   +------------------+                        |&lt;br /&gt;
                           |                                   |&lt;br /&gt;
                           v                                   |&lt;br /&gt;
                    +----------------+                         |&lt;br /&gt;
                    | 接收流特性       |                         |&lt;br /&gt;
+------------------&amp;gt;|                |                         |&lt;br /&gt;
^   {可选的}         +----------------+                         |&lt;br /&gt;
|                          |                                   |&lt;br /&gt;
|                          v                                   |&lt;br /&gt;
|       +&amp;lt;-----------------+                                   |&lt;br /&gt;
|       |                                                      |&lt;br /&gt;
|    {空?     ----&amp;gt; {全部自愿?       } ----&amp;gt; {一些强制性?      }   |&lt;br /&gt;
|       |      否          |          否         |             |&lt;br /&gt;
|       | 是               | 是                  | 是           |&lt;br /&gt;
|       |                  v                     v             |&lt;br /&gt;
|       |           +---------------+    +----------------+    |&lt;br /&gt;
|       |           | 可以协商或不协商 |    | 必须协商一个特性  |    |&lt;br /&gt;
|       |           | 任何一个       |    |                |    |&lt;br /&gt;
|       |           +---------------+    +----------------+    |&lt;br /&gt;
|       v                  |                     |             |&lt;br /&gt;
|   +---------+            v                     |             |&lt;br /&gt;
|   |  完成   |&amp;lt;----- {协商?      }               |             |&lt;br /&gt;
|   +---------+   否       |                     |             |&lt;br /&gt;
|                     是   |                     |             |&lt;br /&gt;
|                          v                     v             |&lt;br /&gt;
|                          +---------&amp;gt;+&amp;lt;---------+             |&lt;br /&gt;
|                                     |                        |&lt;br /&gt;
|                                     v                        |&lt;br /&gt;
+&amp;lt;-------------------------- {强制性重新开始?      } ------------&amp;gt;+&lt;br /&gt;
               否                                        是&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::::::::'''图表3: 流协商流程图'''&lt;br /&gt;
&lt;br /&gt;
===关闭流===&lt;br /&gt;
===方向性===&lt;br /&gt;
===无响应对端的处理===&lt;br /&gt;
====死连接====&lt;br /&gt;
====中断的流====&lt;br /&gt;
====空闲对端====&lt;br /&gt;
====检查方法的使用====&lt;br /&gt;
===流属性===&lt;br /&gt;
====from====&lt;br /&gt;
====to====&lt;br /&gt;
====id====&lt;br /&gt;
====xml:lang====&lt;br /&gt;
====version====&lt;br /&gt;
====流属性总结====&lt;br /&gt;
===XML命名空间===&lt;br /&gt;
====流命名空间====&lt;br /&gt;
====内容命名空间====&lt;br /&gt;
====XMPP内容命名空间====&lt;br /&gt;
====其他命名空间====&lt;br /&gt;
====命名空间声明和前缀====&lt;br /&gt;
===流错误===&lt;br /&gt;
====规则====&lt;br /&gt;
=====流错误是不可恢复的=====&lt;br /&gt;
=====流错误可能发生在安装过程中=====&lt;br /&gt;
=====当主机未定义或未知时会发生流错误=====&lt;br /&gt;
=====流错误发到哪=====&lt;br /&gt;
====语法====&lt;br /&gt;
====已定义的流错误条件====&lt;br /&gt;
=====bad-format=====&lt;br /&gt;
=====bad-namespace-prefix=====&lt;br /&gt;
=====conflict=====&lt;br /&gt;
=====connection-timeout=====&lt;br /&gt;
=====host-gone=====&lt;br /&gt;
=====host-unknown=====&lt;br /&gt;
=====improper-addressing=====&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
=====invalid-from=====&lt;br /&gt;
=====invalid-namespace=====&lt;br /&gt;
=====invalid-xml=====&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
=====not-well-formed=====&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
=====remote-connection-failed=====&lt;br /&gt;
=====reset=====&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
=====restricted-xml=====&lt;br /&gt;
=====see-other-host=====&lt;br /&gt;
=====system-shutdown=====&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
=====unsupported-encoding=====&lt;br /&gt;
=====unsupported-feature=====&lt;br /&gt;
=====unsupported-stanza-type=====&lt;br /&gt;
=====unsupported-version=====&lt;br /&gt;
====应用定义的条件====&lt;br /&gt;
===简化的流示例===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2011-12-26T05:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 确定地址 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权通知'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个留上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#关键字|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#IRI|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#UNICODE|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这种形式是绝对不会在XMPP系统将通过网络发送的.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; 本文或常用参考文档中的协议规范所用到的所有用例里面提供的例子都遵从上述规则. 所有例子都是虚构的并且交换的信息 (例如, 用户名和密码) 不代表任何现存的用户和服务器.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
&lt;br /&gt;
XMPP提供一种异步的端到端的结构化数据交换技术，在一个分布式的可全球寻址和出席信息感知的客户端和服务器的网络中使用直接的持久XML流。这种体系结构形式包含了普遍的网络可用性的知识，以及在给定的客户端-服务器和服务器-服务器会话的时候，不限数量的并发信息交易的概念，所以我们把它称为 &amp;quot;并发交易可用性&amp;quot; (&amp;quot;Availability for Concurrent Transactions&amp;quot;) (简称ACT) 来把它和来自WWW的 &amp;quot;Representational State Transfer&amp;quot; [[RFC6120#REST|REST]] 体系结构形式区别开. 尽管XMPP的体系结构很大程度上类似于 email (参见 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]], 它引入了一些变化以便于准实时通讯.  ACT体系结构形式的独特特性如下. &lt;br /&gt;
&lt;br /&gt;
===全局地址===&lt;br /&gt;
&lt;br /&gt;
和email一样, 为了通过网络路由和递送消息,XMPP使用全球唯一地址(基于DNS). 所有XMPP实体可以在网络上被寻址, 大部分客户端和服务器以及很多外部服务可以被客户端和服务器访问. 通常, 服务器地址的格式为 &amp;lt;域部分&amp;gt; (例如, &amp;lt;im.example.com&amp;gt;), 属于某台服务器的帐号的格式为 &amp;lt;本地部分@域部分&amp;gt; (例如, &amp;lt;juliet@im.example.com&amp;gt;, 称为 &amp;quot;纯JID&amp;quot;), 而连接到一个特定的设备或资源并且已经被(服务器)授权可以和外部交互的客户端的格式为 &amp;lt;本地部分@域部分/资源部分&amp;gt; (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt;, 称为 &amp;quot;全JID&amp;quot;). 因为历史原因, XMPP地址常被称为Jabber IDs 或 JIDs. 因为XMPP地址格式的正式规范依赖于国际化技术（本文撰写时正在制定中），这个格式定义于 [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] 而非本文之中. 术语 &amp;quot;localpart&amp;quot;(本地部分), &amp;quot;domainpart&amp;quot;（域部分）, 和 &amp;quot;resourcepart&amp;quot;（资源部分） 正式定义于  [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] .&lt;br /&gt;
&lt;br /&gt;
===出席信息===&lt;br /&gt;
&lt;br /&gt;
XMPP让一个实体能够向其他实体声明它的网络可用性或者 &amp;quot;presence&amp;quot;（出席信息） . 在XMPP中, 这种可通讯状态是用端到端的专用通讯元素来标识的: 即 &amp;lt;presence/&amp;gt; 节. 尽管网络可用性对于XMPP消息交换并不是必需的, 它还是可以促进实时交互，因为消息发起者可以在发消息之前知道接收者在线并处于可通讯状态. 端到端的出席信息定义于 [[RFC6120#XMPP‑IM|XMPP‑IM]] .&lt;br /&gt;
&lt;br /&gt;
===持久流===&lt;br /&gt;
&lt;br /&gt;
每个点对点的一&amp;quot;跳&amp;quot;都建立了基于TCP长连接的持久XML流来保持可通讯状态. 这些 &amp;quot;always-on&amp;quot; 客户端-服务器 和 服务器-服务器 流使得任何时间每方都能够推送数据到另一方并且立即路由和递送. XML流定义于 [[RFC6120#XML流|4]] .&lt;br /&gt;
&lt;br /&gt;
===结构化数据===&lt;br /&gt;
&lt;br /&gt;
XMPP中基本的协议数据单元不是一个XML流 (它只是为点对点通讯提供传输层) 而是一个 XML 节（&amp;quot;stanza&amp;quot;), 它是一个通过流发送的XML片段. 一个节的根元素包括路由属性 (类似 &amp;quot;from&amp;quot; 和 &amp;quot;to&amp;quot; 地址), 而节的子元素包含了递送给目标接收者的载荷. XML节定义于 [[RFC6120#XML节|8]] .&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;br /&gt;
&lt;br /&gt;
在实践之中, XMPP是一个包含了很多互相通讯的客户端和服务器的网络(当然, 任何两个给定的布署服务器之间的通讯都是严格谨慎的并且也和本地服务策略有关). 因此, 例如, 与服务器 &amp;lt;im.example.com&amp;gt; 关联的用户 &amp;lt;juliet@im.example.com&amp;gt; 能够和服务器 &amp;lt;example.net&amp;gt; 关联的用户 &amp;lt;romeo@example.net&amp;gt; 交换消息，出席信息和其他结构化数据. 这个模式对使用全局地址的消息协议是很常见的, 例如email网络 (见 [[RFC6120#SMTP|SMTP]] 和 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]] . 结果, 在XMPP中端到端的通讯是逻辑上的点对点，而物理结构则是 客户端-服务器-服务器-客户端, 如下图所示. &lt;br /&gt;
&lt;br /&gt;
'''图1: 分布式客户端-服务器 体系结构'''&lt;br /&gt;
&lt;br /&gt;
  example.net &amp;lt;--------------&amp;gt; im.example.com&lt;br /&gt;
      ^                                ^&lt;br /&gt;
      |                                |&lt;br /&gt;
      v                                v&lt;br /&gt;
 romeo@example.net           juliet@im.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 体系结构使用 [[RFC6120#XML流|XML流]] 和 [[RFC6120#XML节|XML节]] ，但是两个客户端之间直接建立端到端的连接则使用基于 [[RFC6120#LINKLOCAL|LINKLOCAL]] 的技术, 不过那个体系结构没有定义在本协议之中，它只能说是 &amp;quot;类XMPP&amp;quot;; 详见 [[RFC6120#XEP‑0174|XEP‑0174]] . 另外, XML流可以在任何可靠的传输层上简历端到端的连接, 包括XMPP本真的扩展; 无论如何, 这些方法没有包含在本文之中.&lt;br /&gt;
&lt;br /&gt;
以下段落描述客户端和服务器们各自在网络中负责什么.&lt;br /&gt;
&lt;br /&gt;
一个客户端就是一个实体，它先和它的注册帐号所在服务器建立XML流 (通过 [[RFC6120#SASL握手|SASL握手]] ) , 然后完成 [[RFC6120#资源绑定|资源绑定]] , 这样就能通过建好的流在客户端和服务器之间递送XML节. 客户端使用 XMPP 来和它的服务器, 其他客户端以及任何其他网络上的实体通讯, 这里服务器负责递送节到同一台服务器上其他已连接的客户端，或把它们路由到远程服务器上. 一个服务器上的注册帐号可以同时使用多个客户端连接到一台服务器上, 这里每个客户端的XMPP地址的 ''资源部分'' 是不同的 (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;), 定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 和 [[RFC6120#资源绑定|7]]&lt;br /&gt;
&lt;br /&gt;
一个服务器是一个实体，主要负责以下事项: &lt;br /&gt;
&lt;br /&gt;
:* 管理已连接客户端的 [[RFC6120#XML流|XML流]] 并通过建好的流递送 [[RFC6120#XML节|XML节]] 到那些通过客户端; 这也包括负责确保客户端在被授权访问XMPP网络之前的客户端身份验证工作.&lt;br /&gt;
:* 遵循本地服务对服务器之间通讯的策略, 管理和远程服务器之间的 [[RFC6120#XML流|XML流]] 并通过建好的流路由 [[RFC6120#XML节|XML节]] 到那些服务器.&lt;br /&gt;
&lt;br /&gt;
取决于服务器的不同, 一个XMPP服务器的次要责任可能包括: &lt;br /&gt;
&lt;br /&gt;
:* 存储客户端使用的数据 (例如, 用户的基于 [[RFC6120#常规引用|XMPP-IM]] 的联系人; 在这种情况下, 相关的XML节直接由服务器本身代替客户端来处理而不用路由到远程服务器或递送到一个已连接的客户端.&lt;br /&gt;
:* 托管的额外服务也使用XMPP作为通讯的基础，但是提供超出本文范围的额外的或 [[RFC6120#常规引用|XMPP-IM]] 定义的功能; 例子包括多用户会议服务(定义于 [[RFC6120#常规引用|XEP‑0045]] ) 和 发布-订阅 服务 (定义于 [[RFC6120#常规引用|XEP‑0060]] ).&lt;br /&gt;
&lt;br /&gt;
==TCP绑定==&lt;br /&gt;
===范围===&lt;br /&gt;
&lt;br /&gt;
如本文定义的XMPP所述, 一个发起方实体在 (客户端或服务器) 和接收方实体协商XML流之前必须(MUST) 打开一个到接收方实体 (服务器) 的 [[RFC6120#常规引用|TCP]] 连接. 然后在使用XML流期间双方一直保持那个TCP连接. 这个规则在下面章节中的TCP绑定要用到.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 不一定要把XML流建立在TCP上, 其他传输协议也是可以的. 例如, 两个实体可以通过 [[RFC6120#提示性引用|HTTP]] 互相连接（定义于 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] . 无论如何, 本协议只定义把XMPP绑定到TCP.&lt;br /&gt;
&lt;br /&gt;
===合格的全域名解析===&lt;br /&gt;
&lt;br /&gt;
因为XML流是是通过TCP发送的, 发起方实体在尝试打开一个XML流之前需要确定接收方实体的IPv4或IPv6地址(以及端口). 一般来说这是通过解析接收方实体的合格的全域名(简称FQDN,参见 [[RFC6120#常规引用|DNS概念]] )来实现的. &lt;br /&gt;
&lt;br /&gt;
====首选流程:SRV查询====&lt;br /&gt;
&lt;br /&gt;
FQDN解析的首选流程是如下使用 [[RFC6120#常规引用|DNS‑SRV]] 记录: &lt;br /&gt;
&lt;br /&gt;
# 发起方实体构造一个 DNS SRV 查询，参数如下:&lt;br /&gt;
## 一个 &amp;quot;xmpp-client&amp;quot; (用于 客户端-服务器 连接) 或 &amp;quot;xmpp-server&amp;quot; (用于 服务器-服务器 连接)服务&lt;br /&gt;
## 一个 &amp;quot;tcp&amp;quot; 协议&lt;br /&gt;
## 一个对应发起方实体希望连接的XMPP服务的 &amp;quot;原有域&amp;quot;（ [[RFC6120#常规引用|TLS‑CERTS]] ）的名字 (例如, &amp;quot;example.net&amp;quot; 或 &amp;quot;im.example.com&amp;quot;)&lt;br /&gt;
# 得到一个类似 &amp;quot;_xmpp-client._tcp.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.im.example.com.&amp;quot; 的查询.&lt;br /&gt;
# 如果收到应答, 它将包含一个或多个FDQN和端口的组合, 每个都拥有权重和优先级 (如 [[RFC6120#常规引用|DNS‑SRV]] 所述). (无论如何, 如果SRV查询的结果是一个单独的资源记录 &amp;quot;.&amp;quot;, 即根域名, 那么发起方实体必须(MUST)在这时终止SRV处理，因为根据 [[RFC6120#常规引用|DNS‑SRV]] ,这样一个结果意味着那个服务在本域中是不可用的)&lt;br /&gt;
# 发起方实体至少选择返回的FQDNs记录中的一个来解决 (根据 [[RFC6120#常规引用|DNS‑SRV]] 规则,对FDQN执行 DNS &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 查询; 这将返回一个 IPv4 或 IPv6 的地址.&lt;br /&gt;
# 成功解析FDQN(包括SRV查询返回的相应的端口号)之后,发起方实体就使用IP地址来连接接收方实体.&lt;br /&gt;
# 如果发起方实体使用那个IP地址连接失败，而的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 记录查询返回了不止一个IP地址, 那么发起方实体使用那个FDQN的下一个解析好的IP地址作为连接地址.&lt;br /&gt;
# 如果发起方实体用给定的FDQN的所有解析出来的IP地址都无法连接, 那么它重复解析过程并使用基于优先级和权重的SRV查询(定义于 [[RFC6120#常规引用|DNS SRV]] )返回的下一个FQDN来连接.&lt;br /&gt;
# 如果发起方实体接收到它的SRV应答但是无法使用接收到的应答数据来建立一个XMPP连接, 它不应该(SHOULD NOT)尝试下面描述的备用流程(这有助于防止入站和出站连接状态不匹配).&lt;br /&gt;
# 如果发起方实体不能从它的SRV查询接收到应答, 它应该(SHOULD)尝试下一节描述的备用流程.&lt;br /&gt;
&lt;br /&gt;
====后备流程====&lt;br /&gt;
&lt;br /&gt;
后备流程应该(SHOULD)是一个常规的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 地址记录解析以决定原始域的IPv4或IPv6地址, 而端口则为 &amp;quot;xmpp-client&amp;quot; 端口(5222)用于客户端-服务器连接或 &amp;quot;xmpp-server&amp;quot; 端口(5269)用于服务器-服务器连接 (这些是在IANA注册的缺省端口，[[RFC6120#端口号和服务名|14.7]] .&lt;br /&gt;
&lt;br /&gt;
如果通过TCP连接不成功, 发起方实体可能尝试找到并使用替代连接方法例如HTTP绑定 (见 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] , 它可能使用 [[RFC6120#提示性引用|DNS‑TXT]] 记录(参见 [[RFC6120#提示性引用|XEP‑0156]]) 来搜索.&lt;br /&gt;
&lt;br /&gt;
====什么时候不用SRV====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体已经被显式地配置为一个关联到接收实体的原始域的一个特定的FQDN (以及潜在的端口) (比如,一个特定的原始域 example.net  &amp;quot;写死&amp;quot; 到一个配置好的 apps.example.com 的 FQDN), 鼓励初始方实体使用配置好的名字而不是建议的对原始域的SRV解析流程.&lt;br /&gt;
&lt;br /&gt;
====附加服务使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
很多XMPP服务器以可托管附加服务 (超出本文和 [[RFC6120#常规引用|XMPP-IM]] 定义范围) 这种方式来实现，附加服务的DNS域名典型的形式是主XMPP服务的 &amp;quot;子域名&amp;quot; (例如, conference.example.net 用于 [[RFC6120#常规引用|XEP‑0045]] 服务,相关的XMPP主服务为 example.net ) 或 底层服务的一级域名的 &amp;quot;子域名&amp;quot; (例如, muc.example.com 用于 [[RFC6120#常规引用|XEP‑0045]] 服务，相关的XMPP主服务为 im.example.com ). 如果一个和远程XMPP服务关联的实体希望连接到这样一个附加服务上, 它将生成一个适当的XML节，而远程服务器将尝试通过一个SRV查询资源记录类似 &amp;quot;_xmpp-server._tcp.conference.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.muc.example.com.&amp;quot; 来解析该附加服务的DNS域名. 所以, 如果一个XMPP服务的管理员希望让远程服务器相关的实体能访问这样的附加服务, 除了用于他们的主XMPP服务的 &amp;quot;_xmpp-server&amp;quot; 记录之外, 他们还需要声明适当的 &amp;quot;_xmpp-server&amp;quot; SRV 记录. 当 SRV 记录不可用的时候, 可使用后备方法 [[RFC6120#后备流程|3.2.2]] 来为附加服务解析域名.&lt;br /&gt;
&lt;br /&gt;
===重连===&lt;br /&gt;
&lt;br /&gt;
XMPP服务器可能在会向连接的客户端和远端服务器提供TCP连接服务的时候意外掉线. 因为这些连接的数量可能非常大, 实体的重连机制寻求解决重连可能导致的对软件性能的冲剂和网络堵塞. 如果实体选择重连, 它: &lt;br /&gt;
&lt;br /&gt;
:* 应该把重连之前等待的秒数设置为0到60之间 (这有助于确保不会所有实体在掉线的同一个时间间隔之后同时尝试重连).&lt;br /&gt;
:* 如果第一次尝试重连没有成功则随后的尝试重连的时间间隔应该越来越长 (例如, 按照 [[RFC6120#提示性引用|ETHERNET]] 描述的 &amp;quot;动态二进制指数后退算法&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
建议重连的时候使用TLS会话恢复 [[RFC6120#提示性引用|TLS‑RESUME]] . 本文未来的某个版本, 或某个独立的协议, 可能会提供更多详细的关于加速重连过程的方法的指南.&lt;br /&gt;
&lt;br /&gt;
===可靠性===&lt;br /&gt;
&lt;br /&gt;
在XMPP使用常连的TCP连接意味着通过XML流发送的XML节可能不可靠, 因为长连的TCP的各方可能无法及时地了解掉线情况. 在XMPP应用层, 长连接掉线可能导致无法发送节. 尽管本文定义的核心XMPP技术未包括克服这一可靠性缺陷的特性, 有一个XMPP扩展在做这件事 (例如, [[RFC6120#提示性引用|XEP‑0198]] ).&lt;br /&gt;
&lt;br /&gt;
==XML流==&lt;br /&gt;
===流基础===&lt;br /&gt;
&lt;br /&gt;
两个基本概念，使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换：XML流和XML节。这些术语的定义如下。&lt;br /&gt;
&lt;br /&gt;
:XML流的定义:&lt;br /&gt;
::XML流是一个容器，用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 &amp;quot;流头&amp;quot; (即, 一个包含了适当树形和命名空间声明的 XML &amp;lt;stream&amp;gt; 标签), 而这个XML流的结尾明确表达为一个关闭的XML &amp;lt;/stream&amp;gt; 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 [[RFC6120#提示性引用|TLS协商]] 或 [[RFC6120#提示性引用|SASL协商]] ) 或用于 XML节. &amp;quot;发起流&amp;quot; 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 &amp;quot;连接到&amp;quot; 或 &amp;quot;和......开启会话&amp;quot; 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 (&amp;quot;应答流&amp;quot;).&lt;br /&gt;
:XML节的定义:&lt;br /&gt;
::XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1)，它的元素名是 &amp;quot;message&amp;quot;, &amp;quot;presence&amp;quot;, 或 &amp;quot;iq&amp;quot; ，而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素但不在第一层 (例如, 包含在一个扩展元素中的 &amp;lt;message/&amp;gt; 元素 ( 做报告用的 [[RFC6120#扩展内容|8.4]] )也不是一个XML节, 不是命名空间 'jabber:client' 或 'jabber:server'限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 [[RFC6120#常规引用|XML‑NAMES]] 和本协议的 [[RFC6120#扩展内容|8.4]]).&lt;br /&gt;
&lt;br /&gt;
有三种节: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的缩写). 这些节类型提供三种不同的通讯原语: 一个 &amp;quot;推送&amp;quot; 机制用于已生成的消息, 一个特定的 &amp;quot;发行-订阅&amp;quot; 机制用于广播网络可用性信息, 和一个 &amp;quot;请求-应答&amp;quot; 机制用于更结构化的数据交换 (类似 [[RFC6120#提示性引用|HTTP]] . 更多解释分别位于 [[RFC6120#Messsage语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] . &lt;br /&gt;
&lt;br /&gt;
考虑一个客户端连接到一个服务器的例子. 客户端通过发送一个流头来发起一个XML流到服务器, 最好在前面加上一个XML声明来指定XML版本和支持的字符串编码 (见 [[RFC6120#包含XML声明|11.5]] 和 [[RFC6120#字符串编码|11.6]] ). 遵循本地策略和服务设置, 该服务器接着以第二个XML流应答回客户端, 最好再次在前面加上一个XML声明. 一旦客户端完成 [[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] , 该客户端就能通过这个流来发送不限数量的XML节. 当客户端想要关闭这个流的时候, 它只要简单的发送一个关闭 &amp;lt;/stream&amp;gt; 标签给服务器，如 [[RFC6120#关闭流|4.4]] . &lt;br /&gt;
&lt;br /&gt;
基本上, 接着, 一个XML流功能作为会话期间发送的XML节的信封而另一个XML流功能作为会话期间接收的XML节的信封. 我们可以如下做一个简单的展示. &lt;br /&gt;
&lt;br /&gt;
'''图2: 两个流的简单视图'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| INITIAL STREAM     |  RESPONSE STREAM   |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| &amp;lt;stream&amp;gt;           |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;stream&amp;gt;           |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;presence&amp;gt;         |                    |&lt;br /&gt;
|   &amp;lt;show/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/presence&amp;gt;        |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;message to='foo'&amp;gt; |                    |&lt;br /&gt;
|   &amp;lt;body/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/message&amp;gt;         |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;iq to='bar'       |                    |&lt;br /&gt;
|     type='get'&amp;gt;    |                    |&lt;br /&gt;
|   &amp;lt;query/&amp;gt;         |                    |&lt;br /&gt;
| &amp;lt;/iq&amp;gt;              |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;iq from='bar'     |&lt;br /&gt;
|                    |     type='result'&amp;gt; |&lt;br /&gt;
|                    |   &amp;lt;query/&amp;gt;         |&lt;br /&gt;
|                    | &amp;lt;/iq&amp;gt;              |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| [ ... ]            |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | [ ... ]            |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;/stream&amp;gt;          |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;/stream&amp;gt;          |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那些习惯于把XML当成一个文档中心的方式的人可能会发现下面的类比是有益的: &lt;br /&gt;
&lt;br /&gt;
:* 两个XML流像两个 &amp;quot;文档&amp;quot; (相当于 [[RFC6120#常规引用|XML]] 的&amp;quot;文档&amp;quot; 产生)，它们是通过积累XML节来建立的.&lt;br /&gt;
:* 根 &amp;lt;stream/&amp;gt; 元素像每个 &amp;quot;文档&amp;quot; 的 &amp;quot;文档实体&amp;quot; (详见 [[RFC6120#常规引用|XML]] 的4.8章).&lt;br /&gt;
:* 通过流发送的XML节像该 &amp;quot;文档&amp;quot;的 &amp;quot;片段&amp;quot; (详见 [[RFC6120#提示性引用|XML‑FRAG]] ).&lt;br /&gt;
&lt;br /&gt;
无论如何, 这些描述只是类比, 因为XMPP不处理文档和片段而是处理流和节. &lt;br /&gt;
&lt;br /&gt;
本节的其余部分定义XML流（连同相关主题）的以下几个方面：&lt;br /&gt;
&lt;br /&gt;
:* 如何打开流 ( [[RFC6120#打开流|4.2]] )&lt;br /&gt;
:* 流协商过程 ( [[RFC6120#流协商|4.3]] )&lt;br /&gt;
:* 如何关闭流 ( [[RFC6120#关闭流|4.4]] )&lt;br /&gt;
:* XML流的方向性 ( [[RFC6120#方向性|4.5]] )&lt;br /&gt;
:* 如何处理沉默的对端 ( [[RFC6120#处理沉默对端|4.6]] )&lt;br /&gt;
:* 流的XML属性 ( [[RFC6120#流属性|4.7]] )&lt;br /&gt;
:* 流的XML命名空间 ( [[RFC6120#流命名空间|4.8]] )&lt;br /&gt;
:* 和XML流相关的错误处理 ( [[RFC6120#流错误|4.9]] )&lt;br /&gt;
&lt;br /&gt;
===打开流===&lt;br /&gt;
&lt;br /&gt;
连接到接收方实体的适当的IP地址和端口之后, 发起方实体通过发送一个流头 (&amp;quot;发起流头&amp;quot;) 来打开到接收方实体的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后接收方实体通过发送一个它自己的流头 (&amp;quot;应答流头&amp;quot;) 来回复发起方实体. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着实体们就可以在进行流协商过程的其他步骤了.&lt;br /&gt;
&lt;br /&gt;
===流协商===&lt;br /&gt;
====基本概念====&lt;br /&gt;
&lt;br /&gt;
因为流的接收方实体可以说是它所服务的域的看门人, 它对客户端或对端服务器的发起的连接有一定的条件要求. 最低程度, 发起方实体在接收方实体被允许发送节之前需要验证接收方实体， (对客户-服务器流来说这意味着使用 [[RFC6120#SASL协商|6]] 中描述的SASL). 无论如何, 接收方实体可以考虑其他验证条件来强制协商, 例如使用 [[RFC6120#TLS协商|5]] 描述的TLS加密. 接收方实体通知发起方实体这些条件通过 &amp;quot;stream features&amp;quot;: 发起方需要在接收方接受它发送的XML节之前完成的一系列特别的协议交互, 以及任何自愿协商但是可以提高XML流处理的协议交互 (例如,  [[RFC6120#提示性引用|XEP‑0138]] 描述的建立应用层压缩). &lt;br /&gt;
&lt;br /&gt;
连接条件的存在意味着流需要协商. 层的顺序 ( [[RFC6120#层的顺序|13.3]] 描述的的TCP, 然后是TLS, 然后是SASL, 然后是XMPP) 意味着流协商是一个多级的过程. 进一步的结构由两个因素来施加: (1) 一个给定的流特性可以仅对特定的实体提供，或只在特定的其他特性已经被协商之后提供 (例如, 资源绑定仅在SASL验证之后提供), 和 (2) 流特性可能是强制协商也可能是自愿协商. 最后, 基于安全的原因一个流的参与者们在成功地完成用于特定特性的协议交互之后需要忘掉它们在协商过程中获得的知识 (例如, 在所有情况下的TLS和当可能建立一个安全层的情况下的SASL, 如有关SASL机制的规范所述). 使用刷新旧的流上下文和通过现有的TCP连接交换新的流头就可以做到这一点.&lt;br /&gt;
&lt;br /&gt;
====流特性格式====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体包含在发起流头里的 'version' 属性值设为不低于 &amp;quot;1.0&amp;quot; (见 [[RFC6120#版本|4.7.5]] ), 接收方实体在发送应答流头之后必须发送一个&amp;lt;features/&amp;gt; 子元素 (通常使用 [[RFC6120#命名空间声明和前缀|4.8.5]] 描述的流命名空间前缀作为前缀) 给发起方实体以声明使流协商过程继续下去的任何条件. 每个条件用 &amp;lt;features/&amp;gt; 元素的子元素的格式, 由一个不同于流命名空间和内容命名空间的命名空间来限定. &amp;lt;features/&amp;gt; 元素可以包含一个字元素，多个子元素，或者为空.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 包含在任何给定的&amp;lt;features/&amp;gt;元素的子元素的顺序不重要.&lt;br /&gt;
&lt;br /&gt;
如果一个特殊的流特性是或者可以是强制协商的, 那个特性的定义需要做以下几件事之一: &lt;br /&gt;
&lt;br /&gt;
:# 声明这个特性总是强制协商的 (例如, XMPP客户端的资源绑定就是这样的); 或&lt;br /&gt;
:# 为接收方实体指定一个方法来标记这个特性在这次交互中为强制协商 (例如, 对于 STARTTLS, 这是通过包含一个空的 &amp;lt;required/&amp;gt; 元素到流特性广告中来实现的, 但是对所有流特性的通用格式); 建议用于新的强制协商特性的流特性定义如 STARTTLS 所做的那样通过包含一个空的 &amp;lt;required/&amp;gt; 元素来实现.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 因为没有通用格式来说明一个特性是强制协商的, 有可能会出现一个发起方实体不能理解的特性而被接收方认为是强制协商的, 而导致流协商过程失败. 尽管这样一个结果是不可取的, 本工作组认为不需要通用格式的情况是很罕见的.&lt;br /&gt;
&lt;br /&gt;
基于安全性的原因, 对于必要的特定流特性，在该特性协商成功之后，发起方将发送一个新的发起流头 (例如, 任何情况下的TLS和当建立了安全层的情况下的SASL). 如果一个给定的流特性出现在这种情况下, 那个特性的定义需要指定该特性协商之后的流重启. &lt;br /&gt;
&lt;br /&gt;
一个包含至少一个强制协商特性的&amp;lt;features/&amp;gt;元素标识流协商没有完成并且发起方实体必须协商更多的特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个&amp;lt;features/&amp;gt;元素可以包含不止一个强制协商特性. 这意味着发起方实体能在流协商过程的这个阶段中对强制协商特性进行选择. 举例来说, 可能一个将来的技术将执行和TLS一样的功能, 所以接收方实体可能在这次流协商过程中的同一个阶段声明同时支持TLS和这个将来的技术. 无论如何, 这只适用于流协商过程中的给定阶段而不适用于不同阶段的强制协商特性 (例如, 接收方实体不会声明同时支持STARTTLS和SASL作为强制性协商, 或同时声明SASL和资源绑定为强制协商, 因为TLS需要在SASL之前协商并且SASL需要在资源绑定之前协商). &lt;br /&gt;
&lt;br /&gt;
一个同时包含强制协商和自愿协商特性的&amp;lt;features/&amp;gt;元素指示协商未完成并且发起方实体可以在它尝试协商强制协商特性之前完成自愿协商特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个只包含自愿协商特性的的&amp;lt;features/&amp;gt;元素指示流协商未完成并且发起方实体可以开始发送XML节了, 但是如果发起方实体愿意可以协商更多特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个空的&amp;lt;features/&amp;gt;元素指示流协商已经完成并且发起方实体可以开始发送XML节. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
一个需要流重启的特性要成功地进行协商, 双方都必须确认前一个流被取代了但是必须不发送一个关闭的&amp;lt;/stream&amp;gt;标签并且必须不能终止底层的TCP连接; 反之, 双方必须重用现有的连接, 它可以是一个新的状态(例如, 作为一个TLS协商的的结果被加密). 然后发起方实体必须发送一个新的发起流头, 它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述. 当接收方实体接收到新的发起流头, 它必须在发送一个新的应答流头(它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述）之前生成一个新的流ID(而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
====重发特性====&lt;br /&gt;
&lt;br /&gt;
接收方实体必须在一个流重启之后发送一个流特性的更新列表给发起方实体. 如果没有更多的特性要被声明，这个更新的流特性列表可以是空的，这个列表也也可以包含任何特性的组合.&lt;br /&gt;
&lt;br /&gt;
====完成流协商====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个空的&amp;lt;features/&amp;gt;元素或只包含自愿协商特性的&amp;lt;features/&amp;gt;元素来表明流协商过程的完成. 这样做之后, 接收方实体可以发送一个空的&amp;lt;features/&amp;gt; 元素(例如, 在这些自愿协商特性协商完成之后) 但是必须不能发送额外的流特性给发起方实体(如果接收方实体有新的特性提供, 最好仅限于强制协商或安全关键的特性, 它可以简单地以一个&amp;lt;reset/&amp;gt;流错误( [[RFC6120#reset|4.9.3.16]] )来关闭流并且等发起方重新连接的时候声明新的特性, 最好以一个交错的方法来关闭现有的流，这样不会让所有的发起方同时进行重连). 一旦流协商完成, 发起方就可以一直通过这个流来发送XML节，只要双方都维持着这个流.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 在下面 [[RFC6120#资源绑定|第7章]] 定义的资源绑定是一个前述规则的一个历史性的例外, 因为对于客户端来说它是强制协商的但使用XML节来达成协商.&lt;br /&gt;
&lt;br /&gt;
在流协商完成之前，发起方实体不能(MUST NOT)尝试发送 [[RFC6120#XML节|XML节]] 给非自身的实体(也就是是说, 客户端的已连接资源或客户端帐号的任何其他已验证的资源) 或给它连接的服务器. 即使发起方尝试这么做, 接收方实体也不能(MUST NOT)接受这些节并且必须以一个&amp;lt;not-authorized/&amp;gt;流错误( [[RFC6120#未授权|4.9.3.12]] )来关闭流. 这个规则只适用于XML节(也就是说, 由内容命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 元素) 而不是用于流协商的XML元素(例如, 完成 [[RFC6120#STARTTLS协商|TLS协商]] 或 [[RFC6120#SASL协商|SASL协商]] 的元素).&lt;br /&gt;
&lt;br /&gt;
====确定地址====&lt;br /&gt;
&lt;br /&gt;
在一个XML流的双方已经完成了流协商的适当步骤之后, 流的接收方实体必须确定发起方实体的JID. &lt;br /&gt;
&lt;br /&gt;
对于客户端-服务器的通讯, 在服务器能确定客户端的地址之前，[[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] 必须完成. 客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;) 必须是授权身份 (如 [[RFC6120#常规引用|SASL]] 所定义的, 要么 (1) 是 [[RFC6120#SASL协商|SASL协商]] 期间客户端直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从服务器的验证身份指定的. 全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)的资源部分(resourcepart)必须是客户端和服务器在 [[RFC6120#资源绑定|资源绑定]] 期间协商得来的那个资源. 客户端必须不去尝试猜测它的JID而是必须相信在资源绑定期间服务器返回给它的JID. 服务器必须确保返回的这个JID (包含 本地部分(localpart), 域部分(domainpart), 资源部分(resourcepart), 以及分隔符) 遵循定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 的XMPP地址规范格式; 为了满足这个限定, 服务器可以把客户端的发来的JID替换成服务器确定的规范JID并在资源绑定期间使用那个JID来和客户端通讯.&lt;br /&gt;
&lt;br /&gt;
对于服务器-服务器通讯, 发起方服务器的纯JID (&amp;lt;domainpart&amp;gt;) 必须是授权的身份 (定义于 [[RFC6120#常规引用|SASL]] ), 要么 (1) 是[[RFC6120#SASL协商|SASL协商]] 期间发起方服务器直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从接收方服务器的验证身份指定的. 在缺少SASL协商的情况下, 接收方服务器可以认为授权身份是一个和相关确认协议协商的身份(例如, 在 服务器回拨[[RFC6120#常规引用|XEP‑0220]] 中 &amp;lt;result/&amp;gt; 元素的'from'属性.&lt;br /&gt;
&lt;br /&gt;
:安全警告: 因为可能会有第三方在一个安全层例如TLS成功协商之前篡改流上发送的数据, 建议接收服务器谨慎对待这些未得到保护的信息; 这特别适用于由发起方实体发送的第一个发起流头中的'from'和'to'地址.&lt;br /&gt;
&lt;br /&gt;
====流程图====&lt;br /&gt;
===关闭流===&lt;br /&gt;
===方向性===&lt;br /&gt;
===无响应对端的处理===&lt;br /&gt;
====死连接====&lt;br /&gt;
====中断的流====&lt;br /&gt;
====空闲对端====&lt;br /&gt;
====检查方法的使用====&lt;br /&gt;
===流属性===&lt;br /&gt;
====from====&lt;br /&gt;
====to====&lt;br /&gt;
====id====&lt;br /&gt;
====xml:lang====&lt;br /&gt;
====version====&lt;br /&gt;
====流属性总结====&lt;br /&gt;
===XML命名空间===&lt;br /&gt;
====流命名空间====&lt;br /&gt;
====内容命名空间====&lt;br /&gt;
====XMPP内容命名空间====&lt;br /&gt;
====其他命名空间====&lt;br /&gt;
====命名空间声明和前缀====&lt;br /&gt;
===流错误===&lt;br /&gt;
====规则====&lt;br /&gt;
=====流错误是不可恢复的=====&lt;br /&gt;
=====流错误可能发生在安装过程中=====&lt;br /&gt;
=====当主机未定义或未知时会发生流错误=====&lt;br /&gt;
=====流错误发到哪=====&lt;br /&gt;
====语法====&lt;br /&gt;
====已定义的流错误条件====&lt;br /&gt;
=====bad-format=====&lt;br /&gt;
=====bad-namespace-prefix=====&lt;br /&gt;
=====conflict=====&lt;br /&gt;
=====connection-timeout=====&lt;br /&gt;
=====host-gone=====&lt;br /&gt;
=====host-unknown=====&lt;br /&gt;
=====improper-addressing=====&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
=====invalid-from=====&lt;br /&gt;
=====invalid-namespace=====&lt;br /&gt;
=====invalid-xml=====&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
=====not-well-formed=====&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
=====remote-connection-failed=====&lt;br /&gt;
=====reset=====&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
=====restricted-xml=====&lt;br /&gt;
=====see-other-host=====&lt;br /&gt;
=====system-shutdown=====&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
=====unsupported-encoding=====&lt;br /&gt;
=====unsupported-feature=====&lt;br /&gt;
=====unsupported-stanza-type=====&lt;br /&gt;
=====unsupported-version=====&lt;br /&gt;
====应用定义的条件====&lt;br /&gt;
===简化的流示例===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2011-12-26T04:50:31Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 确定地址 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权通知'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个留上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#关键字|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#IRI|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#UNICODE|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这种形式是绝对不会在XMPP系统将通过网络发送的.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; 本文或常用参考文档中的协议规范所用到的所有用例里面提供的例子都遵从上述规则. 所有例子都是虚构的并且交换的信息 (例如, 用户名和密码) 不代表任何现存的用户和服务器.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
&lt;br /&gt;
XMPP提供一种异步的端到端的结构化数据交换技术，在一个分布式的可全球寻址和出席信息感知的客户端和服务器的网络中使用直接的持久XML流。这种体系结构形式包含了普遍的网络可用性的知识，以及在给定的客户端-服务器和服务器-服务器会话的时候，不限数量的并发信息交易的概念，所以我们把它称为 &amp;quot;并发交易可用性&amp;quot; (&amp;quot;Availability for Concurrent Transactions&amp;quot;) (简称ACT) 来把它和来自WWW的 &amp;quot;Representational State Transfer&amp;quot; [[RFC6120#REST|REST]] 体系结构形式区别开. 尽管XMPP的体系结构很大程度上类似于 email (参见 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]], 它引入了一些变化以便于准实时通讯.  ACT体系结构形式的独特特性如下. &lt;br /&gt;
&lt;br /&gt;
===全局地址===&lt;br /&gt;
&lt;br /&gt;
和email一样, 为了通过网络路由和递送消息,XMPP使用全球唯一地址(基于DNS). 所有XMPP实体可以在网络上被寻址, 大部分客户端和服务器以及很多外部服务可以被客户端和服务器访问. 通常, 服务器地址的格式为 &amp;lt;域部分&amp;gt; (例如, &amp;lt;im.example.com&amp;gt;), 属于某台服务器的帐号的格式为 &amp;lt;本地部分@域部分&amp;gt; (例如, &amp;lt;juliet@im.example.com&amp;gt;, 称为 &amp;quot;纯JID&amp;quot;), 而连接到一个特定的设备或资源并且已经被(服务器)授权可以和外部交互的客户端的格式为 &amp;lt;本地部分@域部分/资源部分&amp;gt; (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt;, 称为 &amp;quot;全JID&amp;quot;). 因为历史原因, XMPP地址常被称为Jabber IDs 或 JIDs. 因为XMPP地址格式的正式规范依赖于国际化技术（本文撰写时正在制定中），这个格式定义于 [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] 而非本文之中. 术语 &amp;quot;localpart&amp;quot;(本地部分), &amp;quot;domainpart&amp;quot;（域部分）, 和 &amp;quot;resourcepart&amp;quot;（资源部分） 正式定义于  [[RFC6120#XMPP‑ADDR|XMPP‑ADDR]] .&lt;br /&gt;
&lt;br /&gt;
===出席信息===&lt;br /&gt;
&lt;br /&gt;
XMPP让一个实体能够向其他实体声明它的网络可用性或者 &amp;quot;presence&amp;quot;（出席信息） . 在XMPP中, 这种可通讯状态是用端到端的专用通讯元素来标识的: 即 &amp;lt;presence/&amp;gt; 节. 尽管网络可用性对于XMPP消息交换并不是必需的, 它还是可以促进实时交互，因为消息发起者可以在发消息之前知道接收者在线并处于可通讯状态. 端到端的出席信息定义于 [[RFC6120#XMPP‑IM|XMPP‑IM]] .&lt;br /&gt;
&lt;br /&gt;
===持久流===&lt;br /&gt;
&lt;br /&gt;
每个点对点的一&amp;quot;跳&amp;quot;都建立了基于TCP长连接的持久XML流来保持可通讯状态. 这些 &amp;quot;always-on&amp;quot; 客户端-服务器 和 服务器-服务器 流使得任何时间每方都能够推送数据到另一方并且立即路由和递送. XML流定义于 [[RFC6120#XML流|4]] .&lt;br /&gt;
&lt;br /&gt;
===结构化数据===&lt;br /&gt;
&lt;br /&gt;
XMPP中基本的协议数据单元不是一个XML流 (它只是为点对点通讯提供传输层) 而是一个 XML 节（&amp;quot;stanza&amp;quot;), 它是一个通过流发送的XML片段. 一个节的根元素包括路由属性 (类似 &amp;quot;from&amp;quot; 和 &amp;quot;to&amp;quot; 地址), 而节的子元素包含了递送给目标接收者的载荷. XML节定义于 [[RFC6120#XML节|8]] .&lt;br /&gt;
&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;br /&gt;
&lt;br /&gt;
在实践之中, XMPP是一个包含了很多互相通讯的客户端和服务器的网络(当然, 任何两个给定的布署服务器之间的通讯都是严格谨慎的并且也和本地服务策略有关). 因此, 例如, 与服务器 &amp;lt;im.example.com&amp;gt; 关联的用户 &amp;lt;juliet@im.example.com&amp;gt; 能够和服务器 &amp;lt;example.net&amp;gt; 关联的用户 &amp;lt;romeo@example.net&amp;gt; 交换消息，出席信息和其他结构化数据. 这个模式对使用全局地址的消息协议是很常见的, 例如email网络 (见 [[RFC6120#SMTP|SMTP]] 和 [[RFC6120#EMAIL‑ARCH|EMAIL‑ARCH]] . 结果, 在XMPP中端到端的通讯是逻辑上的点对点，而物理结构则是 客户端-服务器-服务器-客户端, 如下图所示. &lt;br /&gt;
&lt;br /&gt;
'''图1: 分布式客户端-服务器 体系结构'''&lt;br /&gt;
&lt;br /&gt;
  example.net &amp;lt;--------------&amp;gt; im.example.com&lt;br /&gt;
      ^                                ^&lt;br /&gt;
      |                                |&lt;br /&gt;
      v                                v&lt;br /&gt;
 romeo@example.net           juliet@im.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 体系结构使用 [[RFC6120#XML流|XML流]] 和 [[RFC6120#XML节|XML节]] ，但是两个客户端之间直接建立端到端的连接则使用基于 [[RFC6120#LINKLOCAL|LINKLOCAL]] 的技术, 不过那个体系结构没有定义在本协议之中，它只能说是 &amp;quot;类XMPP&amp;quot;; 详见 [[RFC6120#XEP‑0174|XEP‑0174]] . 另外, XML流可以在任何可靠的传输层上简历端到端的连接, 包括XMPP本真的扩展; 无论如何, 这些方法没有包含在本文之中.&lt;br /&gt;
&lt;br /&gt;
以下段落描述客户端和服务器们各自在网络中负责什么.&lt;br /&gt;
&lt;br /&gt;
一个客户端就是一个实体，它先和它的注册帐号所在服务器建立XML流 (通过 [[RFC6120#SASL握手|SASL握手]] ) , 然后完成 [[RFC6120#资源绑定|资源绑定]] , 这样就能通过建好的流在客户端和服务器之间递送XML节. 客户端使用 XMPP 来和它的服务器, 其他客户端以及任何其他网络上的实体通讯, 这里服务器负责递送节到同一台服务器上其他已连接的客户端，或把它们路由到远程服务器上. 一个服务器上的注册帐号可以同时使用多个客户端连接到一台服务器上, 这里每个客户端的XMPP地址的 ''资源部分'' 是不同的 (例如, &amp;lt;juliet@im.example.com/balcony&amp;gt; 和 &amp;lt;juliet@im.example.com/chamber&amp;gt;), 定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 和 [[RFC6120#资源绑定|7]]&lt;br /&gt;
&lt;br /&gt;
一个服务器是一个实体，主要负责以下事项: &lt;br /&gt;
&lt;br /&gt;
:* 管理已连接客户端的 [[RFC6120#XML流|XML流]] 并通过建好的流递送 [[RFC6120#XML节|XML节]] 到那些通过客户端; 这也包括负责确保客户端在被授权访问XMPP网络之前的客户端身份验证工作.&lt;br /&gt;
:* 遵循本地服务对服务器之间通讯的策略, 管理和远程服务器之间的 [[RFC6120#XML流|XML流]] 并通过建好的流路由 [[RFC6120#XML节|XML节]] 到那些服务器.&lt;br /&gt;
&lt;br /&gt;
取决于服务器的不同, 一个XMPP服务器的次要责任可能包括: &lt;br /&gt;
&lt;br /&gt;
:* 存储客户端使用的数据 (例如, 用户的基于 [[RFC6120#常规引用|XMPP-IM]] 的联系人; 在这种情况下, 相关的XML节直接由服务器本身代替客户端来处理而不用路由到远程服务器或递送到一个已连接的客户端.&lt;br /&gt;
:* 托管的额外服务也使用XMPP作为通讯的基础，但是提供超出本文范围的额外的或 [[RFC6120#常规引用|XMPP-IM]] 定义的功能; 例子包括多用户会议服务(定义于 [[RFC6120#常规引用|XEP‑0045]] ) 和 发布-订阅 服务 (定义于 [[RFC6120#常规引用|XEP‑0060]] ).&lt;br /&gt;
&lt;br /&gt;
==TCP绑定==&lt;br /&gt;
===范围===&lt;br /&gt;
&lt;br /&gt;
如本文定义的XMPP所述, 一个发起方实体在 (客户端或服务器) 和接收方实体协商XML流之前必须(MUST) 打开一个到接收方实体 (服务器) 的 [[RFC6120#常规引用|TCP]] 连接. 然后在使用XML流期间双方一直保持那个TCP连接. 这个规则在下面章节中的TCP绑定要用到.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 不一定要把XML流建立在TCP上, 其他传输协议也是可以的. 例如, 两个实体可以通过 [[RFC6120#提示性引用|HTTP]] 互相连接（定义于 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] . 无论如何, 本协议只定义把XMPP绑定到TCP.&lt;br /&gt;
&lt;br /&gt;
===合格的全域名解析===&lt;br /&gt;
&lt;br /&gt;
因为XML流是是通过TCP发送的, 发起方实体在尝试打开一个XML流之前需要确定接收方实体的IPv4或IPv6地址(以及端口). 一般来说这是通过解析接收方实体的合格的全域名(简称FQDN,参见 [[RFC6120#常规引用|DNS概念]] )来实现的. &lt;br /&gt;
&lt;br /&gt;
====首选流程:SRV查询====&lt;br /&gt;
&lt;br /&gt;
FQDN解析的首选流程是如下使用 [[RFC6120#常规引用|DNS‑SRV]] 记录: &lt;br /&gt;
&lt;br /&gt;
# 发起方实体构造一个 DNS SRV 查询，参数如下:&lt;br /&gt;
## 一个 &amp;quot;xmpp-client&amp;quot; (用于 客户端-服务器 连接) 或 &amp;quot;xmpp-server&amp;quot; (用于 服务器-服务器 连接)服务&lt;br /&gt;
## 一个 &amp;quot;tcp&amp;quot; 协议&lt;br /&gt;
## 一个对应发起方实体希望连接的XMPP服务的 &amp;quot;原有域&amp;quot;（ [[RFC6120#常规引用|TLS‑CERTS]] ）的名字 (例如, &amp;quot;example.net&amp;quot; 或 &amp;quot;im.example.com&amp;quot;)&lt;br /&gt;
# 得到一个类似 &amp;quot;_xmpp-client._tcp.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.im.example.com.&amp;quot; 的查询.&lt;br /&gt;
# 如果收到应答, 它将包含一个或多个FDQN和端口的组合, 每个都拥有权重和优先级 (如 [[RFC6120#常规引用|DNS‑SRV]] 所述). (无论如何, 如果SRV查询的结果是一个单独的资源记录 &amp;quot;.&amp;quot;, 即根域名, 那么发起方实体必须(MUST)在这时终止SRV处理，因为根据 [[RFC6120#常规引用|DNS‑SRV]] ,这样一个结果意味着那个服务在本域中是不可用的)&lt;br /&gt;
# 发起方实体至少选择返回的FQDNs记录中的一个来解决 (根据 [[RFC6120#常规引用|DNS‑SRV]] 规则,对FDQN执行 DNS &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 查询; 这将返回一个 IPv4 或 IPv6 的地址.&lt;br /&gt;
# 成功解析FDQN(包括SRV查询返回的相应的端口号)之后,发起方实体就使用IP地址来连接接收方实体.&lt;br /&gt;
# 如果发起方实体使用那个IP地址连接失败，而的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 记录查询返回了不止一个IP地址, 那么发起方实体使用那个FDQN的下一个解析好的IP地址作为连接地址.&lt;br /&gt;
# 如果发起方实体用给定的FDQN的所有解析出来的IP地址都无法连接, 那么它重复解析过程并使用基于优先级和权重的SRV查询(定义于 [[RFC6120#常规引用|DNS SRV]] )返回的下一个FQDN来连接.&lt;br /&gt;
# 如果发起方实体接收到它的SRV应答但是无法使用接收到的应答数据来建立一个XMPP连接, 它不应该(SHOULD NOT)尝试下面描述的备用流程(这有助于防止入站和出站连接状态不匹配).&lt;br /&gt;
# 如果发起方实体不能从它的SRV查询接收到应答, 它应该(SHOULD)尝试下一节描述的备用流程.&lt;br /&gt;
&lt;br /&gt;
====后备流程====&lt;br /&gt;
&lt;br /&gt;
后备流程应该(SHOULD)是一个常规的 &amp;quot;A&amp;quot; 或 &amp;quot;AAAA&amp;quot; 地址记录解析以决定原始域的IPv4或IPv6地址, 而端口则为 &amp;quot;xmpp-client&amp;quot; 端口(5222)用于客户端-服务器连接或 &amp;quot;xmpp-server&amp;quot; 端口(5269)用于服务器-服务器连接 (这些是在IANA注册的缺省端口，[[RFC6120#端口号和服务名|14.7]] .&lt;br /&gt;
&lt;br /&gt;
如果通过TCP连接不成功, 发起方实体可能尝试找到并使用替代连接方法例如HTTP绑定 (见 [[RFC6120#提示性引用|XEP‑0124]] 和 [[RFC6120#提示性引用|XEP‑0206]] , 它可能使用 [[RFC6120#提示性引用|DNS‑TXT]] 记录(参见 [[RFC6120#提示性引用|XEP‑0156]]) 来搜索.&lt;br /&gt;
&lt;br /&gt;
====什么时候不用SRV====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体已经被显式地配置为一个关联到接收实体的原始域的一个特定的FQDN (以及潜在的端口) (比如,一个特定的原始域 example.net  &amp;quot;写死&amp;quot; 到一个配置好的 apps.example.com 的 FQDN), 鼓励初始方实体使用配置好的名字而不是建议的对原始域的SRV解析流程.&lt;br /&gt;
&lt;br /&gt;
====附加服务使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
很多XMPP服务器以可托管附加服务 (超出本文和 [[RFC6120#常规引用|XMPP-IM]] 定义范围) 这种方式来实现，附加服务的DNS域名典型的形式是主XMPP服务的 &amp;quot;子域名&amp;quot; (例如, conference.example.net 用于 [[RFC6120#常规引用|XEP‑0045]] 服务,相关的XMPP主服务为 example.net ) 或 底层服务的一级域名的 &amp;quot;子域名&amp;quot; (例如, muc.example.com 用于 [[RFC6120#常规引用|XEP‑0045]] 服务，相关的XMPP主服务为 im.example.com ). 如果一个和远程XMPP服务关联的实体希望连接到这样一个附加服务上, 它将生成一个适当的XML节，而远程服务器将尝试通过一个SRV查询资源记录类似 &amp;quot;_xmpp-server._tcp.conference.example.net.&amp;quot; 或 &amp;quot;_xmpp-server._tcp.muc.example.com.&amp;quot; 来解析该附加服务的DNS域名. 所以, 如果一个XMPP服务的管理员希望让远程服务器相关的实体能访问这样的附加服务, 除了用于他们的主XMPP服务的 &amp;quot;_xmpp-server&amp;quot; 记录之外, 他们还需要声明适当的 &amp;quot;_xmpp-server&amp;quot; SRV 记录. 当 SRV 记录不可用的时候, 可使用后备方法 [[RFC6120#后备流程|3.2.2]] 来为附加服务解析域名.&lt;br /&gt;
&lt;br /&gt;
===重连===&lt;br /&gt;
&lt;br /&gt;
XMPP服务器可能在会向连接的客户端和远端服务器提供TCP连接服务的时候意外掉线. 因为这些连接的数量可能非常大, 实体的重连机制寻求解决重连可能导致的对软件性能的冲剂和网络堵塞. 如果实体选择重连, 它: &lt;br /&gt;
&lt;br /&gt;
:* 应该把重连之前等待的秒数设置为0到60之间 (这有助于确保不会所有实体在掉线的同一个时间间隔之后同时尝试重连).&lt;br /&gt;
:* 如果第一次尝试重连没有成功则随后的尝试重连的时间间隔应该越来越长 (例如, 按照 [[RFC6120#提示性引用|ETHERNET]] 描述的 &amp;quot;动态二进制指数后退算法&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
建议重连的时候使用TLS会话恢复 [[RFC6120#提示性引用|TLS‑RESUME]] . 本文未来的某个版本, 或某个独立的协议, 可能会提供更多详细的关于加速重连过程的方法的指南.&lt;br /&gt;
&lt;br /&gt;
===可靠性===&lt;br /&gt;
&lt;br /&gt;
在XMPP使用常连的TCP连接意味着通过XML流发送的XML节可能不可靠, 因为长连的TCP的各方可能无法及时地了解掉线情况. 在XMPP应用层, 长连接掉线可能导致无法发送节. 尽管本文定义的核心XMPP技术未包括克服这一可靠性缺陷的特性, 有一个XMPP扩展在做这件事 (例如, [[RFC6120#提示性引用|XEP‑0198]] ).&lt;br /&gt;
&lt;br /&gt;
==XML流==&lt;br /&gt;
===流基础===&lt;br /&gt;
&lt;br /&gt;
两个基本概念，使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换：XML流和XML节。这些术语的定义如下。&lt;br /&gt;
&lt;br /&gt;
:XML流的定义:&lt;br /&gt;
::XML流是一个容器，用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 &amp;quot;流头&amp;quot; (即, 一个包含了适当树形和命名空间声明的 XML &amp;lt;stream&amp;gt; 标签), 而这个XML流的结尾明确表达为一个关闭的XML &amp;lt;/stream&amp;gt; 标签. 在流的生存期间, 发起方实体可以通过这个流发送不限数量的XML元素, 这些元素或用来协商这个流 (例如, 完成 [[RFC6120#提示性引用|TLS协商]] 或 [[RFC6120#提示性引用|SASL协商]] ) 或用于 XML节. &amp;quot;发起流&amp;quot; 是从发起方实体 (通常是一个客户端或服务器) 到接收方实体 (通常是一个服务器), 也可视为对应发起方 &amp;quot;连接到&amp;quot; 或 &amp;quot;和......开启会话&amp;quot; 接收方实体. 发起流允许从发起方实体到接收方实体的单向通讯; 为了让接收方实体能够向发起方实体发送节, 接收方实体必须(MUST) 协商一个相反的流 (&amp;quot;应答流&amp;quot;).&lt;br /&gt;
:XML节的定义:&lt;br /&gt;
::XML节是一个XMPP中的基本语义单位. 一个节就是一个第一层元素 (在流的深度=1)，它的元素名是 &amp;quot;message&amp;quot;, &amp;quot;presence&amp;quot;, 或 &amp;quot;iq&amp;quot; ，而它的合格命名空间是 'jabber:client' 或 'jabber:server'. 相比之下, 任何其他命名空间限定的第一层元素都不是一个XML节 (stream errors, stream features, TLS相关的元素, SASL相关的元素, 等等.), 由'jabber:client' 或 'jabber:server' 命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素但不在第一层 (例如, 包含在一个扩展元素中的 &amp;lt;message/&amp;gt; 元素 ( 做报告用的 [[RFC6120#扩展内容|8.4]] )也不是一个XML节, 不是命名空间 'jabber:client' 或 'jabber:server'限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 或 &amp;lt;iq/&amp;gt; 元素也不是一个XML节. 一个XML节典型的包含一个或多个必要的子元素 (以及相关的属性, 元素, 和 XML 字符串数据) 来传达所需的信息, 子元素可以(MAY)使用任何XML命名空间 (见 [[RFC6120#常规引用|XML‑NAMES]] 和本协议的 [[RFC6120#扩展内容|8.4]]).&lt;br /&gt;
&lt;br /&gt;
有三种节: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的缩写). 这些节类型提供三种不同的通讯原语: 一个 &amp;quot;推送&amp;quot; 机制用于已生成的消息, 一个特定的 &amp;quot;发行-订阅&amp;quot; 机制用于广播网络可用性信息, 和一个 &amp;quot;请求-应答&amp;quot; 机制用于更结构化的数据交换 (类似 [[RFC6120#提示性引用|HTTP]] . 更多解释分别位于 [[RFC6120#Messsage语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] . &lt;br /&gt;
&lt;br /&gt;
考虑一个客户端连接到一个服务器的例子. 客户端通过发送一个流头来发起一个XML流到服务器, 最好在前面加上一个XML声明来指定XML版本和支持的字符串编码 (见 [[RFC6120#包含XML声明|11.5]] 和 [[RFC6120#字符串编码|11.6]] ). 遵循本地策略和服务设置, 该服务器接着以第二个XML流应答回客户端, 最好再次在前面加上一个XML声明. 一旦客户端完成 [[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] , 该客户端就能通过这个流来发送不限数量的XML节. 当客户端想要关闭这个流的时候, 它只要简单的发送一个关闭 &amp;lt;/stream&amp;gt; 标签给服务器，如 [[RFC6120#关闭流|4.4]] . &lt;br /&gt;
&lt;br /&gt;
基本上, 接着, 一个XML流功能作为会话期间发送的XML节的信封而另一个XML流功能作为会话期间接收的XML节的信封. 我们可以如下做一个简单的展示. &lt;br /&gt;
&lt;br /&gt;
'''图2: 两个流的简单视图'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| INITIAL STREAM     |  RESPONSE STREAM   |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
| &amp;lt;stream&amp;gt;           |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;stream&amp;gt;           |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;presence&amp;gt;         |                    |&lt;br /&gt;
|   &amp;lt;show/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/presence&amp;gt;        |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;message to='foo'&amp;gt; |                    |&lt;br /&gt;
|   &amp;lt;body/&amp;gt;          |                    |&lt;br /&gt;
| &amp;lt;/message&amp;gt;         |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;iq to='bar'       |                    |&lt;br /&gt;
|     type='get'&amp;gt;    |                    |&lt;br /&gt;
|   &amp;lt;query/&amp;gt;         |                    |&lt;br /&gt;
| &amp;lt;/iq&amp;gt;              |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;iq from='bar'     |&lt;br /&gt;
|                    |     type='result'&amp;gt; |&lt;br /&gt;
|                    |   &amp;lt;query/&amp;gt;         |&lt;br /&gt;
|                    | &amp;lt;/iq&amp;gt;              |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| [ ... ]            |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | [ ... ]            |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
| &amp;lt;/stream&amp;gt;          |                    |&lt;br /&gt;
|--------------------|--------------------|&lt;br /&gt;
|                    | &amp;lt;/stream&amp;gt;          |&lt;br /&gt;
+--------------------+--------------------+&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那些习惯于把XML当成一个文档中心的方式的人可能会发现下面的类比是有益的: &lt;br /&gt;
&lt;br /&gt;
:* 两个XML流像两个 &amp;quot;文档&amp;quot; (相当于 [[RFC6120#常规引用|XML]] 的&amp;quot;文档&amp;quot; 产生)，它们是通过积累XML节来建立的.&lt;br /&gt;
:* 根 &amp;lt;stream/&amp;gt; 元素像每个 &amp;quot;文档&amp;quot; 的 &amp;quot;文档实体&amp;quot; (详见 [[RFC6120#常规引用|XML]] 的4.8章).&lt;br /&gt;
:* 通过流发送的XML节像该 &amp;quot;文档&amp;quot;的 &amp;quot;片段&amp;quot; (详见 [[RFC6120#提示性引用|XML‑FRAG]] ).&lt;br /&gt;
&lt;br /&gt;
无论如何, 这些描述只是类比, 因为XMPP不处理文档和片段而是处理流和节. &lt;br /&gt;
&lt;br /&gt;
本节的其余部分定义XML流（连同相关主题）的以下几个方面：&lt;br /&gt;
&lt;br /&gt;
:* 如何打开流 ( [[RFC6120#打开流|4.2]] )&lt;br /&gt;
:* 流协商过程 ( [[RFC6120#流协商|4.3]] )&lt;br /&gt;
:* 如何关闭流 ( [[RFC6120#关闭流|4.4]] )&lt;br /&gt;
:* XML流的方向性 ( [[RFC6120#方向性|4.5]] )&lt;br /&gt;
:* 如何处理沉默的对端 ( [[RFC6120#处理沉默对端|4.6]] )&lt;br /&gt;
:* 流的XML属性 ( [[RFC6120#流属性|4.7]] )&lt;br /&gt;
:* 流的XML命名空间 ( [[RFC6120#流命名空间|4.8]] )&lt;br /&gt;
:* 和XML流相关的错误处理 ( [[RFC6120#流错误|4.9]] )&lt;br /&gt;
&lt;br /&gt;
===打开流===&lt;br /&gt;
&lt;br /&gt;
连接到接收方实体的适当的IP地址和端口之后, 发起方实体通过发送一个流头 (&amp;quot;发起流头&amp;quot;) 来打开到接收方实体的流. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
I: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='juliet@im.example.com'&lt;br /&gt;
       to='im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后接收方实体通过发送一个它自己的流头 (&amp;quot;应答流头&amp;quot;) 来回复发起方实体. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;?xml version='1.0'?&amp;gt;&lt;br /&gt;
   &amp;lt;stream:stream&lt;br /&gt;
       from='im.example.com'&lt;br /&gt;
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='&lt;br /&gt;
       to='juliet@im.example.com'&lt;br /&gt;
       version='1.0'&lt;br /&gt;
       xml:lang='en'&lt;br /&gt;
       xmlns='jabber:client'&lt;br /&gt;
       xmlns:stream='http://etherx.jabber.org/streams'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接着实体们就可以在进行流协商过程的其他步骤了.&lt;br /&gt;
&lt;br /&gt;
===流协商===&lt;br /&gt;
====基本概念====&lt;br /&gt;
&lt;br /&gt;
因为流的接收方实体可以说是它所服务的域的看门人, 它对客户端或对端服务器的发起的连接有一定的条件要求. 最低程度, 发起方实体在接收方实体被允许发送节之前需要验证接收方实体， (对客户-服务器流来说这意味着使用 [[RFC6120#SASL协商|6]] 中描述的SASL). 无论如何, 接收方实体可以考虑其他验证条件来强制协商, 例如使用 [[RFC6120#TLS协商|5]] 描述的TLS加密. 接收方实体通知发起方实体这些条件通过 &amp;quot;stream features&amp;quot;: 发起方需要在接收方接受它发送的XML节之前完成的一系列特别的协议交互, 以及任何自愿协商但是可以提高XML流处理的协议交互 (例如,  [[RFC6120#提示性引用|XEP‑0138]] 描述的建立应用层压缩). &lt;br /&gt;
&lt;br /&gt;
连接条件的存在意味着流需要协商. 层的顺序 ( [[RFC6120#层的顺序|13.3]] 描述的的TCP, 然后是TLS, 然后是SASL, 然后是XMPP) 意味着流协商是一个多级的过程. 进一步的结构由两个因素来施加: (1) 一个给定的流特性可以仅对特定的实体提供，或只在特定的其他特性已经被协商之后提供 (例如, 资源绑定仅在SASL验证之后提供), 和 (2) 流特性可能是强制协商也可能是自愿协商. 最后, 基于安全的原因一个流的参与者们在成功地完成用于特定特性的协议交互之后需要忘掉它们在协商过程中获得的知识 (例如, 在所有情况下的TLS和当可能建立一个安全层的情况下的SASL, 如有关SASL机制的规范所述). 使用刷新旧的流上下文和通过现有的TCP连接交换新的流头就可以做到这一点.&lt;br /&gt;
&lt;br /&gt;
====流特性格式====&lt;br /&gt;
&lt;br /&gt;
如果发起方实体包含在发起流头里的 'version' 属性值设为不低于 &amp;quot;1.0&amp;quot; (见 [[RFC6120#版本|4.7.5]] ), 接收方实体在发送应答流头之后必须发送一个&amp;lt;features/&amp;gt; 子元素 (通常使用 [[RFC6120#命名空间声明和前缀|4.8.5]] 描述的流命名空间前缀作为前缀) 给发起方实体以声明使流协商过程继续下去的任何条件. 每个条件用 &amp;lt;features/&amp;gt; 元素的子元素的格式, 由一个不同于流命名空间和内容命名空间的命名空间来限定. &amp;lt;features/&amp;gt; 元素可以包含一个字元素，多个子元素，或者为空.&lt;br /&gt;
&lt;br /&gt;
:实现备注: 包含在任何给定的&amp;lt;features/&amp;gt;元素的子元素的顺序不重要.&lt;br /&gt;
&lt;br /&gt;
如果一个特殊的流特性是或者可以是强制协商的, 那个特性的定义需要做以下几件事之一: &lt;br /&gt;
&lt;br /&gt;
:# 声明这个特性总是强制协商的 (例如, XMPP客户端的资源绑定就是这样的); 或&lt;br /&gt;
:# 为接收方实体指定一个方法来标记这个特性在这次交互中为强制协商 (例如, 对于 STARTTLS, 这是通过包含一个空的 &amp;lt;required/&amp;gt; 元素到流特性广告中来实现的, 但是对所有流特性的通用格式); 建议用于新的强制协商特性的流特性定义如 STARTTLS 所做的那样通过包含一个空的 &amp;lt;required/&amp;gt; 元素来实现.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 因为没有通用格式来说明一个特性是强制协商的, 有可能会出现一个发起方实体不能理解的特性而被接收方认为是强制协商的, 而导致流协商过程失败. 尽管这样一个结果是不可取的, 本工作组认为不需要通用格式的情况是很罕见的.&lt;br /&gt;
&lt;br /&gt;
基于安全性的原因, 对于必要的特定流特性，在该特性协商成功之后，发起方将发送一个新的发起流头 (例如, 任何情况下的TLS和当建立了安全层的情况下的SASL). 如果一个给定的流特性出现在这种情况下, 那个特性的定义需要指定该特性协商之后的流重启. &lt;br /&gt;
&lt;br /&gt;
一个包含至少一个强制协商特性的&amp;lt;features/&amp;gt;元素标识流协商没有完成并且发起方实体必须协商更多的特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'&amp;gt;&lt;br /&gt;
       &amp;lt;required/&amp;gt;&lt;br /&gt;
     &amp;lt;/starttls&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个&amp;lt;features/&amp;gt;元素可以包含不止一个强制协商特性. 这意味着发起方实体能在流协商过程的这个阶段中对强制协商特性进行选择. 举例来说, 可能一个将来的技术将执行和TLS一样的功能, 所以接收方实体可能在这次流协商过程中的同一个阶段声明同时支持TLS和这个将来的技术. 无论如何, 这只适用于流协商过程中的给定阶段而不适用于不同阶段的强制协商特性 (例如, 接收方实体不会声明同时支持STARTTLS和SASL作为强制性协商, 或同时声明SASL和资源绑定为强制协商, 因为TLS需要在SASL之前协商并且SASL需要在资源绑定之前协商). &lt;br /&gt;
&lt;br /&gt;
一个同时包含强制协商和自愿协商特性的&amp;lt;features/&amp;gt;元素指示协商未完成并且发起方实体可以在它尝试协商强制协商特性之前完成自愿协商特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个只包含自愿协商特性的的&amp;lt;features/&amp;gt;元素指示流协商未完成并且发起方实体可以开始发送XML节了, 但是如果发起方实体愿意可以协商更多特性. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features&amp;gt;&lt;br /&gt;
     &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
       &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
     &amp;lt;/compression&amp;gt;&lt;br /&gt;
   &amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个空的&amp;lt;features/&amp;gt;元素指示流协商已经完成并且发起方实体可以开始发送XML节. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
R: &amp;lt;stream:features/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====重启====&lt;br /&gt;
&lt;br /&gt;
一个需要流重启的特性要成功地进行协商, 双方都必须确认前一个流被取代了但是必须不发送一个关闭的&amp;lt;/stream&amp;gt;标签并且必须不能终止底层的TCP连接; 反之, 双方必须重用现有的连接, 它可以是一个新的状态(例如, 作为一个TLS协商的的结果被加密). 然后发起方实体必须发送一个新的发起流头, 它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述. 当接收方实体接收到新的发起流头, 它必须在发送一个新的应答流头(它应该被一个XML声明放在前面，如  [[RFC6120#包含XML声明|11.5]] 所述）之前生成一个新的流ID(而不是重用旧的流ID).&lt;br /&gt;
&lt;br /&gt;
====重发特性====&lt;br /&gt;
&lt;br /&gt;
接收方实体必须在一个流重启之后发送一个流特性的更新列表给发起方实体. 如果没有更多的特性要被声明，这个更新的流特性列表可以是空的，这个列表也也可以包含任何特性的组合.&lt;br /&gt;
&lt;br /&gt;
====完成流协商====&lt;br /&gt;
&lt;br /&gt;
接收方实体通过发送一个空的&amp;lt;features/&amp;gt;元素或只包含自愿协商特性的&amp;lt;features/&amp;gt;元素来表明流协商过程的完成. 这样做之后, 接收方实体可以发送一个空的&amp;lt;features/&amp;gt; 元素(例如, 在这些自愿协商特性协商完成之后) 但是必须不能发送额外的流特性给发起方实体(如果接收方实体有新的特性提供, 最好仅限于强制协商或安全关键的特性, 它可以简单地以一个&amp;lt;reset/&amp;gt;流错误( [[RFC6120#reset|4.9.3.16]] )来关闭流并且等发起方重新连接的时候声明新的特性, 最好以一个交错的方法来关闭现有的流，这样不会让所有的发起方同时进行重连). 一旦流协商完成, 发起方就可以一直通过这个流来发送XML节，只要双方都维持着这个流.&lt;br /&gt;
&lt;br /&gt;
:提示性备注: 在下面 [[RFC6120#资源绑定|第7章]] 定义的资源绑定是一个前述规则的一个历史性的例外, 因为对于客户端来说它是强制协商的但使用XML节来达成协商.&lt;br /&gt;
&lt;br /&gt;
在流协商完成之前，发起方实体不能(MUST NOT)尝试发送 [[RFC6120#XML节|XML节]] 给非自身的实体(也就是是说, 客户端的已连接资源或客户端帐号的任何其他已验证的资源) 或给它连接的服务器. 即使发起方尝试这么做, 接收方实体也不能(MUST NOT)接受这些节并且必须以一个&amp;lt;not-authorized/&amp;gt;流错误( [[RFC6120#未授权|4.9.3.12]] )来关闭流. 这个规则只适用于XML节(也就是说, 由内容命名空间限定的 &amp;lt;message/&amp;gt;, &amp;lt;presence/&amp;gt;, 和 &amp;lt;iq/&amp;gt; 元素) 而不是用于流协商的XML元素(例如, 完成 [[RFC6120#STARTTLS协商|TLS协商]] 或 [[RFC6120#SASL协商|SASL协商]] 的元素).&lt;br /&gt;
&lt;br /&gt;
====确定地址====&lt;br /&gt;
&lt;br /&gt;
在一个XML流的双方已经完成了流协商的适当步骤之后, 流的接收方实体必须确定发起方实体的JID. &lt;br /&gt;
&lt;br /&gt;
对于客户端-服务器的通讯, 在服务器能确定客户端的地址之前，[[RFC6120#SASL协商|SASL协商]] 和 [[RFC6120#资源绑定|资源绑定]] 必须完成. 客户端的纯JID (&amp;lt;localpart@domainpart&amp;gt;) 必须是授权身份 (如 [[RFC6120#常规引用|SASL]] 所定义的, 要么 (1) 是 [[RFC6120#SASL协商|SASL协商]] 期间客户端直接与之通讯的身份,要么 (2) 如果SASL协商期间没有指定授权身份，则是从服务器的验证身份派生的. 全JID(&amp;lt;localpart@domainpart/resourcepart&amp;gt;)的资源部分(resourcepart)必须是客户端和服务器在 [[RFC6120#资源绑定|资源绑定]] 期间协商得来的那个资源. 客户端必须不去尝试猜测它的JID而是必须相信在资源绑定期间服务器返回给它的JID. 服务器必须确保返回的这个JID (包含 本地部分(localpart), 域部分(domainpart), 资源部分(resourcepart), 以及分隔符) 遵循定义于 [[RFC6120#常规引用|XMPP‑ADDR]] 的XMPP地址规范格式; 为了满足这个限定, 服务器可以把客户端的发来的JID替换成服务器确定的规范JID并在资源绑定期间使用那个JID来和客户端通讯.&lt;br /&gt;
&lt;br /&gt;
For server-to-server communication, the initiating server's bare JID (&amp;lt;domainpart&amp;gt;) MUST be the authorization identity (as defined by [SASL] (Melnikov, A. and K. Zeilenga, “Simple Authentication and Security Layer (SASL),” June 2006.)), either (1) as directly communicated by the initiating server during SASL negotiation (SASL Negotiation) or (2) as derived by the receiving server from the authentication identity if no authorization identity was specified during SASL negotiation. In the absence of SASL negotiation, the receiving server MAY consider the authorization identity to be an identity negotiated within the relevant verification protocol (e.g., the 'from' attribute of the &amp;lt;result/&amp;gt; element in Server Dialback [XEP‑0220] (Miller, J., Saint-Andre, P., and P. Hancke, “Server Dialback,” March 2010.)).&lt;br /&gt;
&lt;br /&gt;
    Security Warning: Because it is possible for a third party to tamper with information that is sent over the stream before a security layer such as TLS is successfully negotiated, it is advisable for the receiving server to treat any such unprotected information with caution; this applies especially to the 'from' and 'to' addresses on the first initial stream header sent by the initiating entity.&lt;br /&gt;
&lt;br /&gt;
====流程图====&lt;br /&gt;
===关闭流===&lt;br /&gt;
===方向性===&lt;br /&gt;
===无响应对端的处理===&lt;br /&gt;
====死连接====&lt;br /&gt;
====中断的流====&lt;br /&gt;
====空闲对端====&lt;br /&gt;
====检查方法的使用====&lt;br /&gt;
===流属性===&lt;br /&gt;
====from====&lt;br /&gt;
====to====&lt;br /&gt;
====id====&lt;br /&gt;
====xml:lang====&lt;br /&gt;
====version====&lt;br /&gt;
====流属性总结====&lt;br /&gt;
===XML命名空间===&lt;br /&gt;
====流命名空间====&lt;br /&gt;
====内容命名空间====&lt;br /&gt;
====XMPP内容命名空间====&lt;br /&gt;
====其他命名空间====&lt;br /&gt;
====命名空间声明和前缀====&lt;br /&gt;
===流错误===&lt;br /&gt;
====规则====&lt;br /&gt;
=====流错误是不可恢复的=====&lt;br /&gt;
=====流错误可能发生在安装过程中=====&lt;br /&gt;
=====当主机未定义或未知时会发生流错误=====&lt;br /&gt;
=====流错误发到哪=====&lt;br /&gt;
====语法====&lt;br /&gt;
====已定义的流错误条件====&lt;br /&gt;
=====bad-format=====&lt;br /&gt;
=====bad-namespace-prefix=====&lt;br /&gt;
=====conflict=====&lt;br /&gt;
=====connection-timeout=====&lt;br /&gt;
=====host-gone=====&lt;br /&gt;
=====host-unknown=====&lt;br /&gt;
=====improper-addressing=====&lt;br /&gt;
=====internal-server-error=====&lt;br /&gt;
=====invalid-from=====&lt;br /&gt;
=====invalid-namespace=====&lt;br /&gt;
=====invalid-xml=====&lt;br /&gt;
=====not-authorized=====&lt;br /&gt;
=====not-well-formed=====&lt;br /&gt;
=====policy-violation=====&lt;br /&gt;
=====remote-connection-failed=====&lt;br /&gt;
=====reset=====&lt;br /&gt;
=====resource-constraint=====&lt;br /&gt;
=====restricted-xml=====&lt;br /&gt;
=====see-other-host=====&lt;br /&gt;
=====system-shutdown=====&lt;br /&gt;
=====undefined-condition=====&lt;br /&gt;
=====unsupported-encoding=====&lt;br /&gt;
=====unsupported-feature=====&lt;br /&gt;
=====unsupported-stanza-type=====&lt;br /&gt;
=====unsupported-version=====&lt;br /&gt;
====应用定义的条件====&lt;br /&gt;
===简化的流示例===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T06:25:58Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 节点类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
发布-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯粹的通知和包含载荷。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，服务可以（MAY）缓存最后一个发布到节点的条目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 [[XEP-0060#条目缓存|条目缓存]] 章节)的配置情况发送那个条目给订阅者; 如果服务支持 &amp;quot;http://jabber.org/protocol/pubsub#last-published&amp;quot; 特性，那么这个选项的值必须缺省设为 &amp;quot;on_sub_and_presence&amp;quot; (尽管服务应该允许节点所有者覆盖这个缺省值).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
注意: &amp;quot;on_sub_and_presence&amp;quot;设置和订阅者的出席信息相关, 和发布者的出席信息无关.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 [[XEP-0060#发布条目到节点|发布条目到节点]] 了解相关的错误条件)。&lt;br /&gt;
&lt;br /&gt;
节点配置和期待的事件类型决定了是否一个条目必须由发布者提供，这个发布请求或事件通知的条目中是否包含载荷, 以及一个条目ID是由发布者提供还是由pubsub服务生成. 我们可以在下表中总结相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 4: 条目, 载荷, 和条目IDs'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|	|| 仅通知节点 *	|| 包含载荷节点 *&lt;br /&gt;
|-&lt;br /&gt;
|持久节点 ** || 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含载荷；如果发布请求不包含载荷, pubsub服务在事件通知里必须也不包含载荷; 如果发布请求不包含条目ID, pubsub服务必须生成条目ID	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果发布请求包含载荷，事件通知必须包含该载荷; 如果发布请求不包含条目ID，pubsub服务必须（MUST）生成条目ID&lt;br /&gt;
|-&lt;br /&gt;
|临时节点	** || 发布请求不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素; 载荷也不能被包含在发布请求或事件通知中, 尽管时间通知必须包含一个空的&amp;lt;items/&amp;gt;元素; 条目ID既不需要由发布请求提供也不需要由pubsub服务生成	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中应该包含载荷; 如果发布请求包含了载荷，事件通知必须包含载荷; pubsub服务可以生成一个条目ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* 注意: 节点是仅通知还是包含载荷，取决于&amp;quot;pubsub#deliver_payloads&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;** 注意: 节点是持久的还是临时的，取决于&amp;quot;pubsub#persist_items&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布条目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含发布条目的节点。集合可以表现节点之间更复杂的关系。 详见 '''XEP-0248''' .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/%E5%B8%AE%E5%8A%A9:%E7%9B%AE%E5%BD%95</id>
		<title>帮助:目录</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/%E5%B8%AE%E5%8A%A9:%E7%9B%AE%E5%BD%95"/>
				<updated>2011-12-14T06:22:35Z</updated>
		
		<summary type="html">&lt;p&gt;How: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==MediaWiki软件的官方[http://zh.wikipedia.org/wiki/Help:%E7%BC%96%E8%BE%91%E6%89%8B%E5%86%8C 编辑手册]==&lt;br /&gt;
==来自本源维客的[http://wiki.upnb.com/index.php/Mediawiki%E7%AE%80%E6%98%8E%E7%BC%96%E8%BE%91%E6%95%99%E7%A8%8B 简明编辑教程]==&lt;br /&gt;
{{Template:已安装的扩展}}&lt;br /&gt;
[[Category:系统文件]]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T06:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 从属关系 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
发布-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯粹的通知和包含载荷。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，服务可以（MAY）缓存最后一个发布到节点的条目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 [[XEP-0060#条目缓存|条目缓存]] 章节)的配置情况发送那个条目给订阅者; 如果服务支持 &amp;quot;http://jabber.org/protocol/pubsub#last-published&amp;quot; 特性，那么这个选项的值必须缺省设为 &amp;quot;on_sub_and_presence&amp;quot; (尽管服务应该允许节点所有者覆盖这个缺省值).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
注意: &amp;quot;on_sub_and_presence&amp;quot;设置和订阅者的出席信息相关, 和发布者的出席信息无关.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 [[XEP-0060#发布条目到节点|发布条目到节点]] 了解相关的错误条件)。&lt;br /&gt;
&lt;br /&gt;
节点配置和期待的事件类型决定了是否一个条目必须由发布者提供，这个发布请求或事件通知的条目中是否包含载荷, 以及一个条目ID是由发布者提供还是由pubsub服务生成. 我们可以在下表中总结相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 4: 条目, 载荷, 和条目IDs'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|	|| 仅通知节点 *	|| 包含载荷节点 *&lt;br /&gt;
|-&lt;br /&gt;
|持久节点 ** || 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含载荷；如果发布请求不包含载荷, pubsub服务在事件通知里必须也不包含载荷; 如果发布请求不包含条目ID, pubsub服务必须生成条目ID	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果发布请求包含载荷，事件通知必须包含该载荷; 如果发布请求不包含条目ID，pubsub服务必须（MUST）生成条目ID&lt;br /&gt;
|-&lt;br /&gt;
|临时节点	** || 发布请求不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素; 载荷也不能被包含在发布请求或事件通知中, 尽管时间通知必须包含一个空的&amp;lt;items/&amp;gt;元素; 条目ID既不需要由发布请求提供也不需要由pubsub服务生成	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中应该包含载荷; 如果发布请求包含了载荷，事件通知必须包含载荷; pubsub服务可以生成一个条目ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* 注意: 节点是仅通知还是包含载荷，取决于&amp;quot;pubsub#deliver_payloads&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;** 注意: 节点是持久的还是临时的，取决于&amp;quot;pubsub#persist_items&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T06:15:34Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 事件类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
发布-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯粹的通知和包含载荷。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，服务可以（MAY）缓存最后一个发布到节点的条目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 [[XEP-0060#条目缓存|条目缓存]] 章节)的配置情况发送那个条目给订阅者; 如果服务支持 &amp;quot;http://jabber.org/protocol/pubsub#last-published&amp;quot; 特性，那么这个选项的值必须缺省设为 &amp;quot;on_sub_and_presence&amp;quot; (尽管服务应该允许节点所有者覆盖这个缺省值).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
注意: &amp;quot;on_sub_and_presence&amp;quot;设置和订阅者的出席信息相关, 和发布者的出席信息无关.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 [[XEP-0060#发布条目到节点|发布条目到节点]] 了解相关的错误条件)。&lt;br /&gt;
&lt;br /&gt;
节点配置和期待的事件类型决定了是否一个条目必须由发布者提供，这个发布请求或事件通知的条目中是否包含载荷, 以及一个条目ID是由发布者提供还是由pubsub服务生成. 我们可以在下表中总结相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 4: 条目, 载荷, 和条目IDs'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|	|| 仅通知节点 *	|| 包含载荷节点 *&lt;br /&gt;
|-&lt;br /&gt;
|持久节点 ** || 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含载荷；如果发布请求不包含载荷, pubsub服务在事件通知里必须也不包含载荷; 如果发布请求不包含条目ID, pubsub服务必须生成条目ID	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果发布请求包含载荷，事件通知必须包含该载荷; 如果发布请求不包含条目ID，pubsub服务必须（MUST）生成条目ID&lt;br /&gt;
|-&lt;br /&gt;
|临时节点	** || 发布请求不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素; 载荷也不能被包含在发布请求或事件通知中, 尽管时间通知必须包含一个空的&amp;lt;items/&amp;gt;元素; 条目ID既不需要由发布请求提供也不需要由pubsub服务生成	|| 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中应该包含载荷; 如果发布请求包含了载荷，事件通知必须包含载荷; pubsub服务可以生成一个条目ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* 注意: 节点是仅通知还是包含载荷，取决于&amp;quot;pubsub#deliver_payloads&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;** 注意: 节点是持久的还是临时的，取决于&amp;quot;pubsub#persist_items&amp;quot;配置字段.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T03:57:50Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 事件类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
发布-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯粹的通知和包含载荷。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，服务可以（MAY）缓存最后一个发布到节点的条目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 [[XEP-0060#条目缓存|条目缓存]] 章节)的配置情况发送那个条目给订阅者; 如果服务支持 &amp;quot;http://jabber.org/protocol/pubsub#last-published&amp;quot; 特性，那么这个选项的值必须缺省设为 &amp;quot;on_sub_and_presence&amp;quot; (尽管服务应该允许节点所有者覆盖这个缺省值).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
注意: &amp;quot;on_sub_and_presence&amp;quot;设置和订阅者的出席信息相关, 和发布者的出席信息无关.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 [[XEP-0060#发布条目到节点|发布条目到节点]] 了解相关的错误条件)。&lt;br /&gt;
&lt;br /&gt;
节点配置和期待的事件类型决定了是否一个条目必须由发布者提供，这个发布请求或事件通知的条目中是否包含载荷, 以及一个条目ID是由发布者提供还是由pubsub服务生成. 我们可以在下表中总结相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 4: 条目, 载荷, 和条目IDs'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|	|| 仅通知节点 *	|| 包含载荷节点 *&lt;br /&gt;
|-&lt;br /&gt;
|持久节点 ** || 发布请求必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含载荷；如果发布请求不包含载荷, pubsub服务在事件通知里必须也不包含载荷; 如果发布请求不包含条目ID, pubsub服务必须生成条目ID	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时节点	** || 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T03:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 事件类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
发布-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯粹的通知和包含载荷。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，服务可以（MAY）缓存最后一个发布到节点的条目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 [[XEP-0060#条目缓存|条目缓存]] 章节)的配置情况发送那个条目给订阅者; 如果服务支持 &amp;quot;http://jabber.org/protocol/pubsub#last-published&amp;quot; 特性，那么这个选项的值必须缺省设为 &amp;quot;on_sub_and_presence&amp;quot; (尽管服务应该允许节点所有者覆盖这个缺省值).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
注意: &amp;quot;on_sub_and_presence&amp;quot;设置和订阅者的出席信息相关, 和发布者的出席信息无关.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 [[XEP-0060#发布条目到节点|发布条目到节点]] 了解相关的错误条件)。&lt;br /&gt;
&lt;br /&gt;
节点配置和期待的事件类型决定了是否一个条目必须由发布者提供，这个发布请求或事件通知的条目中是否包含载荷, 以及一个条目ID是由发布者提供还是由pubsub服务生成. 我们可以在下表中总结相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-14T03:26:24Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 订阅状态 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 3: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和载荷，如果配置了的话）给实体(遵循订阅配置和内容过滤).。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
出版-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯的通知和包含有效载荷的通知。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，一个服务可以（MAY）缓存最后一个发布到节点的项目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 项目缓存 章节)的配置情况发送那个项目给订阅者。&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 发布一个项目到一个节点 章节了解相关的出错条件)。&lt;br /&gt;
&lt;br /&gt;
是否一个项目必须由一个出版者提供，以及是否一个项目ID由出版者提供还是有pubsub服务生成，取决于被发布的事件的类型。我们在下表中概述相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-13T09:27:45Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 从属关系 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!	!!Outcast	!!None	!!Member !!Publisher	!!Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到成员列表	 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到成员列表 ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Member	||所有者禁止实体	||所有者从成员列表中移除实体	||-- ||所有者添加实体到发布者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从发布者列表中移除实体	||n/a ||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||n/a ||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 4: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或有效载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或有效载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和有效载荷，如果配置了的话）给实体。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
出版-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯的通知和包含有效载荷的通知。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，一个服务可以（MAY）缓存最后一个发布到节点的项目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 项目缓存 章节)的配置情况发送那个项目给订阅者。&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 发布一个项目到一个节点 章节了解相关的出错条件)。&lt;br /&gt;
&lt;br /&gt;
是否一个项目必须由一个出版者提供，以及是否一个项目ID由出版者提供还是有pubsub服务生成，取决于被发布的事件的类型。我们在下表中概述相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-13T09:14:01Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 从属关系 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理权限，在这里协议定义了一个层次从属关系，类似 [[XEP-0045|多用户聊天]] [XEP-0060#附录G:备注|7]] 中所采用的.&lt;br /&gt;
&lt;br /&gt;
所有从属关系必须基于一个纯 JID (&amp;lt;localpart@domain.tld&amp;gt; 或 &amp;lt;domain.tld&amp;gt;) 而不是一个全 JID (&amp;lt;localpart@domain.tld/resource&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Particular kinds of pubsub services MAY enforce additional requirements (e.g., requiring support for a given non-required affiliation or for all affiliations).&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是推荐的（RECOMMENDED）。对于每个被实现支持的非必需从属关系来说, 它应该返回一个&amp;quot;name-affiliation&amp;quot; 的查询特性，这里name是从属关系的名称，类似&amp;quot;member&amp;quot;, &amp;quot;outcast&amp;quot;, 或 &amp;quot;publisher&amp;quot;(见 [[XEP-0060#特性汇总|特性汇总]]). 特殊类的pubsub服务可以（MAY）强制额外的需求 (例如，要求支持一个给定的非必需的从属关系或所有从属关系) 。&lt;br /&gt;
&lt;br /&gt;
'''表 1: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 接收条目 !! 发布条目	!! 删除单个条目	!! 清理节点	!! 配置节点	!! 删除节点&lt;br /&gt;
|-&lt;br /&gt;
|Owner	|| 是	|| 是 || 是 || 是	|| 是	|| 是 || 是&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || 是	|| 是 || 是 || 是*	|| 是*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Publish-Only || 否	|| 否 || 是 || 是*	|| 否*	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Member || 是	|| 是 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|None	|| 是	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || 否	|| 否 || 否 || 否	|| 否	|| 否 || 否&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一个服务可以允许任何发布者 删除/清理 任何已经发布的条目，而不是只允许原始的发布者移除它. 这种行为对于仅发布(publish-only)从属关系是不推荐的, 它应该只允许仅发布(publish-only)实体删除它自己发布的条目.&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 3: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	||Outcast	||None	||Publisher	||Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从出版者列表中移除实体	||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 4: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或有效载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或有效载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和有效载荷，如果配置了的话）给实体。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
出版-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯的通知和包含有效载荷的通知。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，一个服务可以（MAY）缓存最后一个发布到节点的项目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 项目缓存 章节)的配置情况发送那个项目给订阅者。&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 发布一个项目到一个节点 章节了解相关的出错条件)。&lt;br /&gt;
&lt;br /&gt;
是否一个项目必须由一个出版者提供，以及是否一个项目ID由出版者提供还是有pubsub服务生成，取决于被发布的事件的类型。我们在下表中概述相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0060</id>
		<title>XEP-0060</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0060"/>
				<updated>2011-12-13T08:47:44Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 需求 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0060.html XEP-0060]&lt;br /&gt;
&lt;br /&gt;
'''XEP-0060: 发布-订阅'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本协议定义了一个XMPP协议扩展来实现实现通用的 发布-订阅 功能。这个协议使 XMPP实体能在一个pubsub服务创建节点(主题)并发布信息到那些节点上；然后一个事件通知(包含或不包含载荷)被广播到所有订阅了该节点的实体. PubSub因此坚持了经典的观察者设计模式，并可以作为广泛应用的服务基础，包括新闻提要，内容整合，富出席信息，地理位置，工作流系统，网络管理系统，以及任何其他需要事件通知的应用。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Millard, Peter Saint-Andre, Ralph Meijer&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2011 XMPP标准化基金会(XSF). 参见[[XEP-0060#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.13&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2010-07-12&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
===概览===&lt;br /&gt;
&lt;br /&gt;
本文定义的XMPP 发布-订阅 扩展提供了一个框架用于广泛的应用, 包括新闻摘要, 内容整合, 扩展的出席信息, 地理位置, 头像管理, 共享的书签, 拍卖和贸易系统, 工作流系统, 网络管理系统, NNTP网关, 个人信息管理, 以及任何其他需要事件通知的应用.&lt;br /&gt;
&lt;br /&gt;
这个技术使用了经典的 &amp;quot;发布-订阅&amp;quot; 或曰 &amp;quot;观察者&amp;quot; 设计模式: 一个人或应用发布信息, 同时一个事件通知 (包含或不包含有效载荷) 被广播到所有授权的订阅者. 通常, 发布者和订阅者之间的联系是由一个服务来调节的,这个服务接收发布请求，广播事件通知到订阅者, 并使有权限的实体能够管理被授权发布或订阅的人员或应用列表. 对于发布和订阅的焦点是一个节点 &amp;quot;node&amp;quot; ，它是发布者发送数据的目的地，也是订阅者接收通知的目的地. 节点也维护一个事件历史并提供其他服务以补充纯粹的 pubsub 模式.&lt;br /&gt;
&lt;br /&gt;
本文定义一个通用的协议，所有 pubsub 应用都能使用. 兼容的实现不需要实现这里定义的所有特性 (参见 [[XEP-0060#特性汇总|特性汇总]].)  其他协议可以定义 发布-订阅 的子集 &amp;quot;subsets&amp;quot; 或范本 &amp;quot;profiles&amp;quot; 用于特定的场合, 但是这些范本超过了本文的范围.&lt;br /&gt;
&lt;br /&gt;
===它如何工作===&lt;br /&gt;
&lt;br /&gt;
尽管本协议很大，因为它定义了各方面的用例和可能的错误流, 但是基本的思路是简单的:&lt;br /&gt;
&lt;br /&gt;
# 一个实体发布信息到一个 发布-订阅 服务上的一个节点.&lt;br /&gt;
# pubsub服务推送一个通知到所有被授权可以得知该发布信息的实体.&lt;br /&gt;
&lt;br /&gt;
可能最流行的类似 发布-订阅 功能的应用是内容整合, 它常见于和博客，新闻网站，以及其他互联网可用的经常更新的信息相关联的 RSS 和 Atom ([http://tools.ietf.org/html/rfc4287 RFC 4287] [[XEP-0060#附录G:备注|1]]) 种子. 设想一个&amp;lt;hamlet@denmark.lit&amp;gt;发布博客的例子. 当 Hamlet 写下一篇新博文, 他的博客软件把该文发布到一个位于&amp;lt;pubsub.shakespeare.lit&amp;gt;的pubsub节点:&lt;br /&gt;
&lt;br /&gt;
'''例子 1. 发布者发布一篇新博文'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='pub1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是 发布-订阅 的发布 &amp;quot;pub&amp;quot; 部分.&lt;br /&gt;
&lt;br /&gt;
现在 pubsub 服务通知所有订阅者有新博文了:&lt;br /&gt;
&lt;br /&gt;
'''例子 2. 服务通知订阅者'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bard@shakespeare.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        [ ... ENTRY ... ]&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里是一个甚至更简单的例子: 一个临时的节点只发送通知而不带有效载荷:&lt;br /&gt;
&lt;br /&gt;
'''例子 3. 一个临时通知'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='elsinore/doorbell'/&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
自然, 涉及的实体为了得到完整的 pubsub 功能可能需要完成其他用例 -- 例如, 发布者可能需要建立一个节点 (见 [[XEP-0060#新建节点|新建节点]]) 并且订阅者可能需要注册才能得到通知(见  [[XEP-0060#订阅节点|订阅节点]]). 这些用例在本文的其他部分有完整的描述. (关于哪些特性是必需的，哪些是推荐的或可选的信息, 参考 [[XEP-0060#特性汇总|特性汇总]].)&lt;br /&gt;
&lt;br /&gt;
==术语表==&lt;br /&gt;
&lt;br /&gt;
以下术语始终用于本文中涉及的pubsub服务场合的元素，对象，或动作.(注意: 本文的一些术语在正文中有更详细的解释.)&lt;br /&gt;
&lt;br /&gt;
:'''授权访问模式'''&lt;br /&gt;
::一个节点访问模式,一个实体只能在所有者批准了订阅申请之后才能订阅(订阅申请被接受但是只是临时的),并且只有订阅者可以接收条目.&lt;br /&gt;
:'''地址'''&lt;br /&gt;
::(1) 一个 JID (定义在 [[RFC6120|XMPP核心]] [[XEP-0060#附录G:备注|2]] )中, 或 (2) 一个JID和一个 [[XEP-0030|服务发现]] [[XEP-0060#附录G:备注|3]] 的联合节点.&lt;br /&gt;
:'''集合节点'''&lt;br /&gt;
::一个节点类型，它包含很多节点 和/或 其他集合，但是不包括发布的条目. 集合允许表现节点之间更复杂的联系. 集合节点定义于 [http://xmpp.org/extensions/xep-0248.html PubSub集合节点] [[XEP-0060#附录G:备注|4]] .&lt;br /&gt;
:'''实体'''&lt;br /&gt;
::一个以JID为地址的Jabber实体(客户端，服务，应用程序等).&lt;br /&gt;
:'''事件'''&lt;br /&gt;
::一个节点状态的一次变更&lt;br /&gt;
:'''即时节点'''&lt;br /&gt;
::一个节点，它的NodeID由pubsub服务自动生成的&lt;br /&gt;
:'''条目'''&lt;br /&gt;
::一个XML片段，它由一个节点发布, 从而生成一个事件&lt;br /&gt;
:'''条目ID'''&lt;br /&gt;
::在一个特定节点中一个条目的唯一标识符&lt;br /&gt;
:'''叶子节点'''&lt;br /&gt;
::一个节点类型，它仅包含已发布的条目. 它不是一个其他节点的容器&lt;br /&gt;
:'''节点'''&lt;br /&gt;
::一个虚拟的位置，它的信息可以被发布，并且它的事件通知 和/或 有效载荷可以被接收（在其他pubsub系统中，可能被称为“topic”（主题））.&lt;br /&gt;
:'''节点ID'''&lt;br /&gt;
::在一个特定的pubsub服务中一个节点的唯一标识符，节点ID可由节点创建者提供，也可由pubsub服务生成（如果节点创建者请求一个即时节点）。节点ID可以（MAY）有语义(例如，在一些系统或在pubsub范本如PEP中，节点ID可以是一个相关载荷的XML命名空间)但是它的含义是可选的. 如果一个文档为某个XMPP pubsub系统的领域定义了一个唯一性的给定的节点ID，它必须指定这个相关载荷的XML命名空间.&lt;br /&gt;
:'''通知'''&lt;br /&gt;
::一个发送给订阅者的消息,通知他们一个事件&lt;br /&gt;
:'''被拒者'''&lt;br /&gt;
::一个不被允许订阅或发布到一个节点的实体&lt;br /&gt;
:'''所有者'''&lt;br /&gt;
::一个节点的管理者，可能不止一个; 经常（但不是必要的）是节点创建者&lt;br /&gt;
:'''开放式访问模式'''&lt;br /&gt;
::一个节点访问模式，任何实体都可以订阅和接收条目而不需要批准.&lt;br /&gt;
:'''载荷'''&lt;br /&gt;
::包含在一个发布请求或一个事件通知中&amp;lt;item/&amp;gt;元素中的XML数据. 一个给定的载荷由一个XML命名空间和相关的schema来定义. 一个定义了某种载荷格式的文档应该指定该载荷是仅用于节点ID和其XML命名空间相同的场合，还是可以使用任何节点ID. 这样一个文档也应该指出是否建议这些载荷发布到的节点最好配置成单独的节点.&lt;br /&gt;
:'''个人事件'''&lt;br /&gt;
::一个简化的 发布-订阅 子集，用于即时消息和出席信息应用的场合, 据此每个IM用户的JID是一个虚拟的pubsub服务; 详见 [[XEP-0163|个人事件协议]] [[XEP-0060#附录G:备注|5]] .&lt;br /&gt;
:'''出席信息访问模式'''&lt;br /&gt;
::一个访问模式，任何订阅了所有者出席信息(以类型&amp;quot;from&amp;quot; 或 &amp;quot;both&amp;quot;订阅,见 [[RFC3921]] )的实体，可以订阅该节点并从节点接收条目；这个访问模式主要应用于即时消息系统。&lt;br /&gt;
:'''发布者'''&lt;br /&gt;
::一个实体，被允许发布项目到并且被自动订阅该节点&lt;br /&gt;
:'''仅发布者'''&lt;br /&gt;
::一个实体，被允许发布条目到一个节点，但是不被允许接收通知. (这个角色在节点没有使用开放式访问模式而自动化的实体需要代表所有者生成通知的时候有用.)&lt;br /&gt;
:'''发布服务'''&lt;br /&gt;
::一个遵循本文所定义的协议的 XMPP 服务器或组件&lt;br /&gt;
:'''名册访问模式'''&lt;br /&gt;
::一个节点访问模式，任何订阅了所有者的出席信息并且在指定的名册组中的实体可以订阅这个节点并从这个节点接收条目; 这个访问模式主要用于即时消息系统.&lt;br /&gt;
:'''订阅者'''&lt;br /&gt;
::订阅了某个节点的一个实体&lt;br /&gt;
:'''白名单访问模式'''&lt;br /&gt;
::一个节点访问模式，一个实体只有被节点所有者显式地允许才能订阅和接收条目(从未授权的实体发出的订阅请求被拒绝).&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
pubsub服务的需求可能是由终端用户的需要驱动的，也包括其他可能使用这项服务的组件或服务器。首先，一个用Jabber实现的pubsub服务必须（MUST）提供基本的特性来实现一个纯的 发布-订阅 模式:&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）能够发布事件给一个服务，这样所有某个节点的订阅者能接收到事件通知. 见 [[XEP-0060#发布条目到节点|发布条目到节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须能订阅一个节点(或能收到不允许订阅的通知). 见 [[XEP-0060#订阅节点|订阅节点]]&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许丛从属于一个节点。被允许的从属关系包括所有者(owner)、发布者(publisher)、无(none)、被拒者(outcast)。实现必须（MUST）支持的从属关系包括所有者(owner)和无(none)，也可以（MAY）支持成员,被拒者,发布者和仅发布者。见 [[XEP-0060#从属关系|从属关系]] 。&lt;br /&gt;
&lt;br /&gt;
* 实体必须（MUST）被允许查询pubsub服务（或一个特定的节点）以确定该服务(或节点)实现提供了本文定义的哪些可选的特性。这个查询必须（MUST）使用服务发现(disco#info)协议. 见 [[XEP-0060#查询节点信息|查询节点信息]]&lt;br /&gt;
&lt;br /&gt;
一个基于Jabber的pubsub服务可能需要使用其他特性，但是这些特性是可选的（OPTIONAL）所以不是强制和本协议兼容的。无论如何，如果这些特性被实现了，它们必须（MUST）按照此处本协议的规定来保证兼容性。这些特性包括:&lt;br /&gt;
&lt;br /&gt;
* 服务可以（MAY）缓存最近一次发布到一个节点的条目（即使&amp;quot;persistent-items&amp;quot;选项被设置成false）；如果它确实把缺省的 &amp;quot;cache-last-item&amp;quot; 设置成 true，它应该（SHOULD）按照&amp;quot;send_last_published_item&amp;quot;字段的配置来发送最近发布的条目（或关于它的通知）给订阅的实体。&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以订阅这个节点.&lt;br /&gt;
* 节点所有者应该（SHOULD）能够指定谁可以发布项目到这个节点.&lt;br /&gt;
* 节点可以（MAY）被配置成在事件通知内交付已发布的载荷。&lt;br /&gt;
* 节点可以（MAY）被配置成持久发布条目给一些持久存储机制.&lt;br /&gt;
* 节点可以（MAY）被配置成有限数量的持久条目.&lt;br /&gt;
* 服务可以（MAY）支持 '''XEP-0248''' 所述的集合.&lt;br /&gt;
* 服务或节点可以（MAY）支持扩展的服务发现信息(meta-data).&lt;br /&gt;
&lt;br /&gt;
==预备==&lt;br /&gt;
&lt;br /&gt;
===从属关系===&lt;br /&gt;
&lt;br /&gt;
为了管理许可，在这里协议定义了一个层次从属关系，类似多用户聊天系统中所采用的（Multi-User Chat 6）.&lt;br /&gt;
&lt;br /&gt;
对于 &amp;quot;owner&amp;quot; 和 &amp;quot;none&amp;quot; 的从属关系的支持是必需的（REQUIRED）。其他所有的从属关系的支持是建议的（RECOMMENDED）。特殊种类的pubsub服务可以（MAY）强制额外的需求。&lt;br /&gt;
&lt;br /&gt;
'''表 2: 从属关系和他们的权限'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!从属关系	!! 订阅	!! 发布项目	!! 清理项目	!! 配置节点	!! 删除节点	!! 删除项目&lt;br /&gt;
|-&lt;br /&gt;
|所有者	|| Yes	|| Yes || Yes || Yes	|| Yes	|| Yes&lt;br /&gt;
|-&lt;br /&gt;
|Publisher || Yes || Yes || No	|| No || No	|| Yes/No *&lt;br /&gt;
|-&lt;br /&gt;
|None	||Yes	|| No	|| No	|| No	|| No	|| No&lt;br /&gt;
|-&lt;br /&gt;
|Outcast || No	|| No	|| No	|| No	|| No	|| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 注意: 一旦一个项目已经出版给某个节点，那个服务可以（MAY）允许任何出版者删除任何项目而不是只允许原始的出版者删除它（这是一个可发现的服务，通过&amp;quot;pubsub#delete-any&amp;quot;特性）。&lt;br /&gt;
&lt;br /&gt;
实体如何变更它和节点的从属关系是很明确的。一般来讲，一个从属关系状态的改变需要所有者的动作。从属关系改变和他们的触发动作定义在下表中。&lt;br /&gt;
&lt;br /&gt;
'''表 3: 从属关系状态图'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	||Outcast	||None	||Publisher	||Owner&lt;br /&gt;
|-&lt;br /&gt;
|Outcast	||--	||所有者移除禁令	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|None	||所有者禁止实体	||--	||所有者添加实体到出版者列表	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Publisher	||所有者禁止实体	||所有者从出版者列表中移除实体	||--	||所有者添加实体到所有者列表&lt;br /&gt;
|-&lt;br /&gt;
|Owner	||n/a	||所有者辞职	||n/a	||--&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===订阅状态===&lt;br /&gt;
&lt;br /&gt;
订阅某个节点可以有很多状态&lt;br /&gt;
&lt;br /&gt;
'''表 4: 订阅状态'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!订阅状态	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|无	|| 节点不能（MUST NOT）发送事件通知或有效载荷给实体.&lt;br /&gt;
|-&lt;br /&gt;
|未决的	|| 一个实体已经申请订阅一个节点，但是这个申请还没被节点所有者批准。节点在处于这个状态时不能（MUST NOT）发送事件通知或有效载荷给实体。&lt;br /&gt;
|-&lt;br /&gt;
|未配置的	|| 一个节点已经订阅但是它的订阅选项还没有配置。节点在这个状态时可以（MAY）发送事件通知或有效载荷给实体。 服务可以（MAY）让未配置的订阅过期作废。&lt;br /&gt;
|-&lt;br /&gt;
|已订阅的	|| 一个实体已经订阅了一个节点。节点在这个状态下必须（MUST）发送所有事件通知（和有效载荷，如果配置了的话）给实体。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===事件类型===&lt;br /&gt;
&lt;br /&gt;
出版-订阅协议需要两个主要的尺度来使我们能够衡量一个事件：持久性和临时性，纯的通知和包含有效载荷的通知。协议的实现应该（SHOULD）让所有者能够从两个尺度都可以配置一个节点。&lt;br /&gt;
&lt;br /&gt;
无论一个节点是否配置成持久性或者临时性的事件，一个服务可以（MAY）缓存最后一个发布到节点的项目，在这种情况下，它应该（SHOULD）根据&amp;quot;send_last_published_item&amp;quot;选项(参见本文的 项目缓存 章节)的配置情况发送那个项目给订阅者。&lt;br /&gt;
&lt;br /&gt;
一个pubsub服务必须（MUST）确认发布请求在这两个方面都满足节点的配置。(参见本文的 发布一个项目到一个节点 章节了解相关的出错条件)。&lt;br /&gt;
&lt;br /&gt;
是否一个项目必须由一个出版者提供，以及是否一个项目ID由出版者提供还是有pubsub服务生成，取决于被发布的事件的类型。我们在下表中概述相关的规则:&lt;br /&gt;
&lt;br /&gt;
'''表 5: 事件类型，项目，项目ID'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
|--&amp;gt;	|| 通知	|| 有效载荷&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，它可以（MAY）是空的或者包含有效载荷；如果项目 ID 不是由发布者提供，它必须（MUST）由pubsub服务生成	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷；如果项目 ID 没有被发布者提供，它必须（MUST）由pubsub服务生成&lt;br /&gt;
|-&lt;br /&gt;
|临时的	|| 发布者不能（MUST NOT）包含一个 &amp;lt;item/&amp;gt; 元素(所以项目 ID 不需要提供也不需要生成) 但是通知将包含一个空的 &amp;lt;items/&amp;gt; 元素	|| 发布者必须（MUST）包含一个 &amp;lt;item/&amp;gt; 元素，其中包含有效载荷，但是项目 ID 是可选的（OPTIONAL）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点类型===&lt;br /&gt;
&lt;br /&gt;
有两个节点类型:&lt;br /&gt;
&lt;br /&gt;
'''表 6: 节点类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!节点类型	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|叶节点	|| 一个仅包含发布的项目的节点。它不包含任何其他节点。这是最常见的节点类型。&lt;br /&gt;
|-&lt;br /&gt;
|集合节点	|| 一个包含节点和/或其他集合但是不包含出版项目的节点。集合可以实现多层次的节点结构。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===节点访问模式===&lt;br /&gt;
&lt;br /&gt;
为了使节点建立对客户更简单，我们定义了以下节点访问模式(为了公开性):&lt;br /&gt;
&lt;br /&gt;
'''表 7: 节点访问模式'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!访问模式	!! 描述&lt;br /&gt;
|-&lt;br /&gt;
|开放的	|| 任何实体可以订阅这个节点(比如, 订阅不需要批准) ，以及任何实体可以从这个节点接收项目(比如，不需要被订阅)；这应该（SHOULD）是一般pubsub幅服务的缺省访问模式。&lt;br /&gt;
|-&lt;br /&gt;
|持久的	|| 任何拥有&amp;quot;from&amp;quot;或&amp;quot;both&amp;quot;类型的订阅的实体可以向节点订阅和接收项目；这个访问模式主要应用于即时消息系统 (参见 RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|名册	|| 任何处于指定名册组中的实体可以向节点订阅和接收项目；这种访问模式主要用于即时消息系统 (参见see RFC 3921).&lt;br /&gt;
|-&lt;br /&gt;
|授权的	|| 节点所有者必须批准所有订阅请求，并且只有订阅者可以从节点接收项目.&lt;br /&gt;
|-&lt;br /&gt;
|白名单	|| 一个实体仅仅在被节点所有者加入白名单的时候才可以被订阅（主动提出的订阅请求会被拒绝），并且只有订阅者可以从节点接收项目。换句话说，缺省的从属关系是排斥的。节点所有者必须（MUST）自动进入白名单。为了添加实体进入白名单，节点所有者应该（SHOULD）使用本文的 管理从属关系实体章节中所定义的方式。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
尽管专门的出版-订阅 系统实施可以（MAY）只支持访问模式的一个子集，但一般来说 出版-订阅系统实施应该（SHOULD）支持所有已定义的访问模式。在一个专门部署的系统中，系统服务提供哪些访问模式是一个问题（比如，一些受限的系统部署可能希望锁定许可从而只提供“被授权的”和&amp;quot;白名单&amp;quot;的访问模式,或甚至只提供&amp;quot;白名单&amp;quot;的访问模式）。&lt;br /&gt;
&lt;br /&gt;
为了使一个节点创建者或所有者指定访问模式,使用了'pubsub#access_model'配置域(参见本文的Create a Node With Default Configuration and Configure a Node(以缺省配置创建一个节点和配置一个节点)章节).&lt;br /&gt;
&lt;br /&gt;
===寻址===&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点是可设定地址的，它必须（MUST）被设定为一个JID或一个JID和一个节点的组合。\[7\]&lt;br /&gt;
&lt;br /&gt;
====JID====&lt;br /&gt;
&lt;br /&gt;
如果一个 pubsub 节点的地址被设定成一个JID，节点ID必须（MUST）是资源ID，并且节点ID不能（MUST NOT）是JID中的&amp;quot;user&amp;quot;部分（如&amp;quot;domain.tld/NodeID&amp;quot; 和 &amp;quot;user@domain.tld/NodeID&amp;quot; 是被允许的; &amp;quot;NodeID@domain.tld&amp;quot; 是不允许的）。JID 寻址应该(SHOULD)在使用不支持节点属性的协议和一个 pubsub 节点互动的时候使用.例如,当一个服务允许实体向节点订阅出席信息,它会把节点地址设成JID。如果一个 pubsub 节点可以被设置成 JID ，pubsub 服务必须（MUST）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，pubsub服务定位于主机名 pubsub.shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 4. 节点地址设定为 domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub.shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在再考虑以下例子, pubsub 服务定位于 pubsub@shakespeare.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 5. 节点地址设定为 user@domain.tld/NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='pubsub@shakespeare.lit/news announcements'&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====JID+NodeID====&lt;br /&gt;
&lt;br /&gt;
如果一个pubsub服务地址可以被设成一个JID加一个节点，这个节点ID必须（MUST）是发现服务中的'node'属性值，同时也是pubsub服务的'node'属性值；用于发现服务时，一个pubsub节点等同于一个发现服务的节点。如果一个pubsub节点可以被设置成 JID 加 node，这个pubsub服务应该（SHOULD）确保节点ID符合 RFC 3920中规定的Resourceprep profile of Stringprep。&lt;br /&gt;
&lt;br /&gt;
考虑以下例子，（虚拟的）pubsub服务定位于 hamlet@denmark.lit.&lt;br /&gt;
&lt;br /&gt;
'''案例 6. 节点地址设为 JID+NodeID'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq to='hamlet@denmark.lit'&amp;gt;&lt;br /&gt;
    &amp;lt;query node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实体用例==&lt;br /&gt;
&lt;br /&gt;
本章规定了使用案例，用于任何希望和出版-订阅服务互动的实体使用的协议，主要集中于发现服务的使用案例。&lt;br /&gt;
&lt;br /&gt;
===发现特性===&lt;br /&gt;
&lt;br /&gt;
一个服务必须(MUST)回应符合名字空间'http://jabber.org/protocol/disco#info'的发现服务信息请求。由pubsub服务返回的&amp;quot;disco#info&amp;quot;结果必须（MUST）表明服务的标识符以及支持哪些pubsub特性。&lt;br /&gt;
&lt;br /&gt;
'''案例 7. 实体查询 Pubsub 服务支持的特性'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''案例 8. Pubsub 服务返回支持的特性组'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
   &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
       &amp;lt;identity category='pubsub' type='service'/&amp;gt;&lt;br /&gt;
       &amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能存在的 pubsub 特性在本文中到处都是，并且它们都已经在本文的 XMPP资源注册事项 章节描述了。想了解哪个特性是必需的，建议的，可选的，参见本文的 特性总结 章节。&lt;br /&gt;
&lt;br /&gt;
===5.2 发现节点===&lt;br /&gt;
&lt;br /&gt;
如果一个服务实现了一个多层次节点（也就是 集合节点），它必须（MUST）也要让实体能够通过 服务发现协议发现这些多层次节点，在结果集很大的时候遵照 XEP-0030 的建议(这时候应该(SHOULD)使用Jabber search或一些其他协议).以下例子展示在一个多层次 pubsub 服务中如何使用 服务发现 来发现可用的节点.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点层次和集合节点是可选的(OPTIONAL). 详细情况参照本文的 节点ID术语 和 集合节点章节.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在第一个例子中,一个实体向一个根节点(比如服务本身)发送一个服务发现条目(&amp;quot;disco#items&amp;quot;)请求,它是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 9. 实体请求所有一级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 10. 服务返回所有一级节点__ {anchor:xml}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='blogs' name='Weblog updates'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='news' name='News and announcements'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二个例子中,一个实体发送一个 disco#items 请求给其中一个一级节点,它也是一个集合节点:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 11. 实体请求二级节点__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__案例 12. 服务返回二级节点__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='nodes2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='blogs'&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='princely_musings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='kingly_ravings'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='starcrossed_stories'/&amp;gt;&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' node='moorish_meanderings'/&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果一个叶子节点不仅是一个集合节点,它本身也有条目发行,这个服务可以(MAY)为每一个已出版的条目返回一个 &amp;lt;item/&amp;gt; 元素(参见本文的 从一个节点发现条目 章节),无论如何这些条目一定不能(MUST NOT)包含一个 'node' 属性(因为它们是已发行的条目,不是节点).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.3 发现节点信息__ {anchor:发现节点信息}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个 pubsub 服务必须（MUST）允许实体去查询每个单独的节点来获得该节点的相关信息。必须（MUST）使用服务发现协议来查询这些信息。&amp;quot;disco#info&amp;quot; 结果必须（MUST）包含一个ID，其类别是“pubsub”，类型是“leaf”或“collection”。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 如果一个节点的 id 类型为“leaf”，它一定不能（MUST NOT）包含其它的节点或集合（只有条目）；如果一个节点的ID类型是“collection”，它一定不能（MUST NOT）包含条目（只有其它节点或集合）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 13. 实体查询集合节点的信息__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='info2'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 14. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='blogs'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='collection'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 15. 实体查询叶子节点信息__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 16. 服务应答 pubsub/collection ID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='info1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.4 发现节点元数据__ {anchor:发现节点元数据}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disco#info&amp;quot; 结果可以（MAY）包含节点的详细元数据，封装在数据窗体[第九章]中，其格式参见Service Discovery Extensions（服务发现扩展） [第十章]。数据窗体上下文由 &amp;quot;http://jabber.org/protocol/pubsub#meta-data&amp;quot; 中的 FORM_TYPE 定义，并符合Field Standardization for Data Forms（数据窗体的字段标准化）[第十一章]。如果元数据被提供了，它应该（SHOULD）所有已配置的选项值，像&amp;quot;automatic&amp;quot; 信息一样，比如节点创建日期，出版者列表以及类似的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 17. 实体查询一个节点的信息__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 18. 服务应答信息和元数据__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='meta1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;identity category='pubsub' type='leaf'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#meta-data&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#type' label='Payload type'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://www.w3.org/2005/Atom&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creator' label='Node creator'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#creation_date' label='Creation date'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;2003-07-29T22:56Z&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#title' label='A short name for the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Princely Musings (Atom)&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#description' label='A description of the node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;Updates for Hamlet's Princely Musings weblog.&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#language' label='Default language'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#contact' label='People to contact with questions'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;bard@shakespeare.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#owner' label='Node owners'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#publisher' label='Publishers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;hamlet@denmark.lit&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field var='pubsub#num_subscribers' label='Number of subscribers to this node'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;value&amp;gt;1066&amp;lt;/value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 节点元数据可以用多种方法设置。一些是基于节点配置（如所有者的JID），也有的是动态的（如订阅者的号码）。任何在节点元数据中提供的静态信息应该（SHOULD）在节点配置窗体中以字段形式提供。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的元数据直接由节点映射表中特定的元数据属性提供。参见Dublin Core Metadata Initiative (DCMI) [第十二章]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__表 8: Dublin Core Meta-Data Mapping（Dulbin 核心元数据映射表）__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
Pubsub Field	|Dublin Core Meta-Data Attribute&lt;br /&gt;
&lt;br /&gt;
pubsub#creation_date	|Date [第十三章]&lt;br /&gt;
&lt;br /&gt;
pubsub#creator	|Creator&lt;br /&gt;
&lt;br /&gt;
pubsub#description	|Description&lt;br /&gt;
&lt;br /&gt;
pubsub#language	|Language&lt;br /&gt;
&lt;br /&gt;
pubsub#publisher	|Publisher&lt;br /&gt;
&lt;br /&gt;
pubsub#title	|Title&lt;br /&gt;
&lt;br /&gt;
pubsub#type	|Type [第十四章]&lt;br /&gt;
&lt;br /&gt;
{table}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.5 从一个节点查询条目__ {anchor:从一个节点查询条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了查询服务中特定节点的已出版条目，一个实体可以（MAY）发送&amp;quot;disco#items&amp;quot;请求给节点本身，服务可以（MAY）通过&amp;lt; item/&amp;gt;返回每个条目。每个条目的'name'属性必须（MUST）包括它的ItemID，并且条目不能（MUST NOT）有'node'属性。这个 ItemID 可以（MAY）用于接收条目（参见本协议文档中Retrieve Items from a Node（从一个节点接收条目） 章节 ）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 19. 实体请求一个节点的所有条目__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='items1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item jid='pubsub.shakespeare.lit' name='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.6 找回订阅__ {anchor:找回订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许实体查询服务以找回它对服务中所有节点的订阅。为了做出这些查询，请求的实体必须（MUST）发送一个 IQ-get 消息，这个消息的　&amp;lt;pubsub/&amp;gt; 子元素包含一个没有属性的空&amp;lt;subscriptions/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 20. 实体请求所有当前的订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个订阅列表，它必须（MUST）返回所有和请求消息中'from'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)　匹配的 JIDs的信息．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个订阅, 返回一个 &amp;lt;subscription/&amp;gt; 元素以指明 NodeID, 以及这个节点ID相关联的 JID(可以包含资源，视实体如何订阅而定)，目前的订阅状态。如果服务支持订阅ID(subscription identifier)，'subid' 属性也必须（MUST）出现.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 21. 服务返回所有当前订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node1' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node2' jid='francisco@denmark.lit' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node5' jid='francisco@denmark.lit' subscription='unconfigured'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='node6' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/subscriptions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有订阅，pubsub 服务必须（MUST）返回一个空的 &amp;lt;subscriptions/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 22. 没有订阅__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持订阅找回,服务必须（MUST）应答一个&amp;lt;feature-not-implemented/&amp;gt; 错误, 指出 pubsub-specific 的错误条件 &amp;lt;unsupported/&amp;gt; 以及特性 &amp;quot;retrieve-subscriptions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 23. 不支持订阅找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='subscriptions1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscriptions/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-subscriptions'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__5.7 找回加入__ {anchor:找回加入}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务应该（SHOULD）允许一个实体查询这个服务以找回它在所有节点的加入信息。为了做出这些请求，实体要在请求消息中包含一个没有属性的空 &amp;lt;affiliations/&amp;gt; 元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 24. 实体请求所有当前加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务返回一个加入的列表，它必须（MUST）返回所有和请求的'form'属性的　纯JID (&amp;lt;node@domain.tld&amp;gt;)相匹配的JID的加入信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于每个加入信息, 返回一个 &amp;lt;affiliation/&amp;gt; 元素，包含　NodeID 和加入状态 (所有这owner, 发布者publisher, or 流浪者outcast).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 25. 服务应答所有当前加入__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node1' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node2' affiliation='publisher'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node5' affiliation='outcast'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliation node='node6' affiliation='owner'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/affiliations&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体没有加入, pubsub 服务必须（MUST）返回一个空的 &amp;lt;affiliations/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 26. 没有加入__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务不支持加入找回, 服务必须（MUST）应答一个 &amp;lt;feature-not-implemented/&amp;gt; 错误, 指明一个 &amp;lt;unsupported/&amp;gt;的　pubsub-specific 错误条件和 &amp;quot;retrieve-affiliations&amp;quot;　的特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 27. 不支持加入找回__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='affil1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;affiliations/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='retrieve-affiliations'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6. 订阅者用例__ {anchor:订阅者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本节定义了潜在和实际的订阅者使用协议的用例。（注意：本文的实施备注一节描述了一个pubsub服务器必须（MUST）遵守的许多重要的因素和商业规则．另外，所有例子都假定独立的pubsub组件存在并包含任何含有服务器或网络标记的相关'from'地址）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.1 向一个节点订阅__ {anchor:向一个节点订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当一个Jabber实体希望从一个节点订阅，它向pubsub服务发送订阅请求。订阅申请是一个 IQ-set　消息，其&amp;lt;pubsub/&amp;gt; 元素包含并且仅包含一个&amp;lt;subscribe/&amp;gt;元素．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'node' 属性指明实体希望订阅的节点．这个&amp;lt;subscribe/&amp;gt;元素必须（MUST）拥有一个'jid' 属性指明用于订阅的JID确切的 XMPP 地址－－通常是一个纯JID(&amp;lt;node@domain.tld&amp;gt;) 或一个全JID(&amp;lt;node@domain.tld/resource&amp;gt;)，当然&amp;lt;domain.tld&amp;gt; 或 &amp;lt;domain.tld/resource&amp;gt;格式的JID也可以订阅．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果指定的JID 是一个纯JID或一个全JID，服务必须（MUST）从接收的IQ请求中的’from’属性中分离出最小化的纯JID部分，以确保发出请求的实体和被加入到订阅者列表的JID是同一个ID。无论如何，一些实现可以（MAY）允许服务管理员配置一个实体列表不进行此项检查；那些实体可能被作为 &amp;quot;trusted proxies&amp;quot;（被信任的代理），可以为其他实体进行订阅．同样的，一些实现可以（MAY）允许实体黑名单，禁止其执行特定的动作（比如订阅或者建立节点）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可以（MAY）允许实体多次订阅同一个节点．这是一个实体能够用不同的订阅选项进行订阅．如果允许用同一个JID进行多次订阅，服务必须（MUST）使用'subid'属性来区分同一实体的不同订阅（所以SubID必须（MUST）对于每一个node+JID的组合是唯一的，并且在发送给订阅者实体的任何时候SubID必须（MUST）出现在实体元素中）。不建议（NOT RECOMMENDED）客户端生成SubID，因为可能引发冲突；所以一个服务应该（SHOULD）为订阅者生成一个SubID，并且如果订阅者提供了 SubID，服务可以重写它．如果服不允许同一个实体多次订阅但是接收到了额外的订阅请求，服务必须（MUST）返回当前的订阅状态（如果这个订阅以前就被批准了）．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这里是一个订阅请求的例子.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 28. 实体向一个节点订阅__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅请求被成功处理，服务器必须（MUST）通知请求实体它已订阅（可以(MAY)包含一个服务生成的SubID）.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 29. 服务返回成功__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务也可以（MAY）发送最后一次发行的条目给新的订阅者．包含这个条目的消息应该（SHOULD）被标记为符合'jabber:x:delay'名字空间的扩展信息(参见 Delayed Delivery [第十五章])，以表明它是延时发送的．（注意在这个例子中消息通知发送给纯JID，因为那是已订阅的JID）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 30. 服务发送最后一次发行的条目__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;summary&amp;gt; To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? &amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/items&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/event&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:delay' stamp='20031213T23:58:37'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致订阅请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. JID　的纯JID部分不符.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式并且请求实体没有订阅所有者的出席信息。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;的访问模式并且请求实体不在授权名单组中。&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;的访问模式并且请求实体不在白名单中。&lt;br /&gt;
&lt;br /&gt;
   1. 订阅节点的时候服务需要付费。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体是匿名的并且服务不允许匿名实体订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有一个未决的订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被封锁订阅(例如，因为被加入黑名单)。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不支持订阅。&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误案例全部描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果JID的纯JID部分不符合上述的描述并且请求实体没有一些由实现定义的管理或者代理权限，服务必须（MUST）返回一个&amp;lt;bad-request/&amp;gt;错误，它也应（SHOULD）包含一个pubsub- specific的&amp;lt;invalid-jid/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 31. JID不匹配__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;invalid-jid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;presence&amp;quot;访问模式的节点，如果请求实体没有订阅所有者的出席信息，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;presence-subscription-required/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 32. 实体没有被授权建立一个订阅(需要出席信息订阅)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;roster&amp;quot;访问模式的节点，如果请求实体不在授权的名单组中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;not-in-roster-group/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 33. 实体没有被授权建立一个订阅(不在名册组中)__&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;白名单&amp;quot;访问模式的节点，如果请求实体不在白名单中，pubsub服务必须（MUST）返回一个 &amp;lt;not-authorized/&amp;gt; 错误，它也应该（SHOULD）包含一个 pubsub-specific 的&amp;lt;closed-node/&amp;gt;错误条件。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 34. 节点有白名单访问模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业部署可能希望把订阅连接到一个付费客户数据库。如果为了订阅节点需要付费（例如，如果订阅者不在客户数据库中或客户还未付帐），服务应该（SHOULD）返回一个 &amp;lt;payment-required/&amp;gt; 错误给订阅者。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 35. 订阅需要付费__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一些 XMPP 服务器可能允许使用SASL　ANONYMOUS验证；无论如何，因为这会导致实体不稳定（分配的JID可能不是同一个负责人in a persistent manner），一个服务可以(MAY)防止匿名实体订阅一个节点并且应该（SHOULD）使用服务发现来决定是否有一个 &amp;quot;account/anonymous&amp;quot;实体．如果一个请求实体是匿名的但是服务器不允许匿名实体订阅，服务应该返回一个&amp;lt; forbidden/&amp;gt;错误给订阅者．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 36. 请求实体是匿名用户__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='anonymous@denmark.lit/foo'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='anonymous@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有一个未决的订阅, 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅,表明一个发生了pubsub-specific　&amp;lt;pending-subscription/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 37. 请求实体有一个未决的订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;pending-subscription xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被一个订阅屏蔽了(例如, 因为它在禁止加入的名单中), 服务器必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 38. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不允许实体订阅, 服务应该(SHOULD)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者,提出一个pubsub- specific　&amp;lt;unsupported/&amp;gt;错误条件和一个&amp;quot;subscribe&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 39. 订阅不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
	&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
	&amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
	&amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscribe'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 40. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于拥有&amp;quot;authorize&amp;quot;访问模式的节点, 订阅请求必须(MUST)由节点所有者批准; 所以pubsub服务发送一个消息给节点所有者请求授权(参见本文的 Manage Subscription Requests 章节). 因为订阅请求可能被批准也可能不被批准, 服务必须(MUST)返回一个未决通知给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 41. 服务应答未决__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='pending'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果实体在接收通知之前必须配置它的订阅选项(见本文 Configure Subscription Options　章节),服务必须(MUST)通知实体这件事. 它应该(SHOULD)返回一个IQ-result给请求实体一个记号表示需要订阅配置。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 42. 服务应答成功并指出需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;required/&amp;gt;&lt;br /&gt;
&amp;lt;/subscribe-options&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 只有订阅者在收到任何通知之前必须配置订阅，节点才应该包含这个&amp;lt;required/&amp;gt;子元素. 如果配置是必需的而配置请求没有在合理的时间内提交，一个服务可以(MAY)判定订阅请求超时(取决于服务或节点的配置).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同样的, 如果没有同步的配置就不能新建这个订阅, 服务可以(MAY)返回一个&amp;lt;not-acceptable/&amp;gt; 错误, 表示发生了一个pubsub-specific &amp;lt;configuration-required/&amp;gt;错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 43. 服务返回错误说明需要配置订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver'&amp;gt;&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest'&amp;gt;&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body'&amp;gt;&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;configuration-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果没有包含&amp;lt;required/&amp;gt;元素也没有错误返回, 订阅立刻生效并且实体可以在任何时间配置这个订阅(服务可以(MAY)通过在IQ-result中包含一个空的&amp;lt;subscribe- options/&amp;gt;元素指出支持订阅选项, 如下案例所示).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 44. 服务应答成功并指出支持订阅配置但不是必需的__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='sub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;subscription node='princely_musings' jid='francisco@denmark.lit' subscription='unconfigured'&amp;gt;&lt;br /&gt;
&amp;lt;subscribe-options/&amp;gt;&lt;br /&gt;
&amp;lt;/subscription&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.2 从一个节点取消订阅__ {anchor:从一个节点取消订阅}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了从一个节点取消订阅, 订阅者发送一个 IQ-set， 它的 &amp;lt;pubsub/&amp;gt; 子元素包含一个&amp;lt;unsubscribe/&amp;gt;元素，指明节点和已订阅的 JID.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 45. 实体从一个节点取消订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求可以被成功处理,服务必须(MUST)一个　IQ result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 46. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有很多原因可能导致取消订阅失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体有多个订阅指向节点但未指定一个订阅ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求未指定一个已存在的订阅者.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限取消指定JID的订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定的订阅ID不合法或不是当前的.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误情景描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体有多个订阅指向节点但是没有指定一个订阅ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个 &amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件 .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 47. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果'jid'属性的值未指定一个已存在的订阅者, pubsub服务必须(MUST)返回一个错误节, 它应该(SHOULD)是&amp;lt;unexpected-request/&amp;gt;并且也应该(SHOULD)包含一个 &amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 48. 请求实体不是一个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被禁止取消特定JID的订阅, 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误. 服务必须(MUST)检查这个做出请求的实体是否被授权可以取消订阅. 如果订阅者的JID格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)通过比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分执行这个检查以确保它们是吻合的. 如果这些JID的纯JID部分不吻合并且请求实体没有被授权取消这个JID的订阅(例如, 因为它不是一个服务管理员或被授权的代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 49. 请求实体被禁止取消订阅实体__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='bard@shakespeare.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
&amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个 &amp;lt;item-not-found/&amp;gt; 错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 50. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
&amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅标识符关联于某个订阅项, 取消订阅请求必须(MUST)包含一个适当的'subid'属性. 如果这个取消订阅请求包含一个 SubID 但是节点不支持 SubIDs (或订阅者第一次并没有使用 SubID 来订阅), 服务应该(SHOULD)忽略这个 SubID 并简单地取消订阅这个实体. 如果订阅者以前使用一个 SubID 来订阅但是取消订阅申请包含一个不合法或非当前订阅者的 SubID , 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它应该(SHOULD)也包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 51. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='unsub1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;unsubscribe node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
&amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.3 配置订阅选项__ {anchor:配置订阅选项}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
实现可以(MAY)允许订阅者们配置订阅选项. 实现应该(SHOULD)使用数据表单(Data Forms)协议来实现这个配置(无论如何, 一个带外机制如web界面也可能被提供).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个服务支持订阅选项, 它必须(MUST)在它对&amp;quot;disco#info&amp;quot;查询的应答中声明(在应答中包含一个feature,其'var'属性为&amp;quot;pubsub#subscription-options&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 52. Pubsub服务显示对订阅选项的支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='feature1'&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;feature var='http://jabber.org/protocol/pubsub#subscription-options'/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个订阅者通过在IQ-set节中包含一个&amp;lt;options/&amp;gt;元素来请求订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 53. 订阅者请求订阅选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求被成功的处理, 服务必须(MUST)应答选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 54. 服务应答选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='options1'&amp;gt;&lt;br /&gt;
&amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
&amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
&amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;&amp;gt;&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#deliver' type='boolean' label='Enable delivery?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#digest' type='boolean' label='Receive digest notifications (approx. one per day)?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#include_body' type='boolean' label='Receive message body in addition to payload?'&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;field var='pubsub#show-values' type='list-multi' label='Select the presence types which are allowed to receive notifications'&amp;gt;&lt;br /&gt;
&amp;lt;option label='Want to Chat'&amp;gt;&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Available'&amp;gt;&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Away'&amp;gt;&amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Extended Away'&amp;gt;&amp;lt;value&amp;gt;xa&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option label='Do Not Disturb'&amp;gt;&amp;lt;value&amp;gt;dnd&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/options&amp;gt;&lt;br /&gt;
&amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 前述的例子展示了一些(但不是所有)的可能(MAY)被提供的配置选项. 如果一个实现使用数据表单(Data Forms)协议提供了这些选项, 它必须(MUST)使用那些在和'http://jabber.org/protocol/pubsub'名字空间关联的XMPP Registrar中注册了的字段(以上初步展示了那些字段, 并且在本文的 pubsub#subscribe_options FORM_TYPE 章节也描述了它们, 但是不能(MUST NOT)被当作规范, 因为 XMPP Registrar 以后还可以在不改变本文的情况下标准化更多的字段).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 很多相关的数据表单字段有一个 &amp;quot;boolean&amp;quot; 类型并且必须(MUST)被有效处理. [16]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
很多原因可以导致选项请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体没有足够的权限来修改指定的JID的订阅选项.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体(或指定的订阅者)未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有同时指定 NodeID 和订阅者的 JID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求没有指定一个订阅项ID但是它被需要.&lt;br /&gt;
&lt;br /&gt;
   1. 请求指定了一个订阅项ID但不是合法的或当前的.&lt;br /&gt;
&lt;br /&gt;
   1. 订阅选项不知吃.&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
更多的错误案例描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请求订阅选项的时候, 订阅者必须(MUST)指定向节点订阅的 JID 并且应该(SHOULD)指定一个节点(如果没有指定节点, 服务必须(MUST)认为请求实体希望为它的订阅项向根集合节点请求订阅选项; 详见本文的根集合节点章节).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务必须(MUST)验证提出请求的实体已经被授权为订阅的实体设置订阅选项. 如果订阅者的JID的格式是&amp;lt;node@domain.tld/resource&amp;gt;, 服务必须(MUST)比较两个JID的&amp;lt;node@domain.tld&amp;gt;部分以确保他们是吻合的. 如果两个JID的纯JID部分不吻合并且请求实体没有被授权修改这个JID的订阅选项(例如, 因为它不是一个服务范围内的管理员或授权代理), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 55. 请求实体没有足够的权限修改订阅选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='bernardo@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
  &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体(或指定的订阅者, 如果不同的话) 未曾订阅, 服务必须(MUST)返回一个 &amp;lt;unexpected-request/&amp;gt; 错误, 它(SHOULD)也包括一个 &amp;lt;not-subscribed/&amp;gt; 的 pubsub-specific 错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 56. 没有这个订阅者__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者没有指定一个JID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;jid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 57. 订阅者JID未指定__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options/&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;jid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某个订阅项, 为了服务能够区分来自同一实体的订阅,在订阅请求中必须(MUST)带上'subid'属性. 如果'subid'是必需的但未被提供, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 58. 需要SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='sub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符关联于某订阅项, 但请求包含的 SubID 不合法或不是当前订阅者的, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 59. 非法的订阅项标识符__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='unsub1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;unsubscribe node='princely_musings' subid='991d7fd1616fd041015064133cd097a10030819e' jid='francisco@denmark.lit'/&amp;gt;      &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
  &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点或服务不支持订阅选项, 服务必须(MUST)应答一个&amp;lt;feature-not-implemented/&amp;gt;错误, 指定一个&amp;lt;unsupported/&amp;gt;的pubsub-specific错误条件和一个&amp;quot;subscription-options&amp;quot;特性.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 60. 订阅选项不支持__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors' feature='subscription-options'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, pubsub服务必须(MUST)返回一个&amp;lt;item-not-found/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 61. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options1'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'/&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
 &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
  &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
 &amp;lt;/error&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接收了配置表单之后, 请求实体应该(SHOULD)提交这个表单来更新这个实体对于那个节点的订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 62. 订阅者提交完整的选项表单__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
   &amp;lt;/x&amp;gt;&lt;br /&gt;
  &amp;lt;/options&amp;gt;&lt;br /&gt;
 &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务能成功处理提交的表单, 它必须(MUST)应答成功.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 63. 服务应答成功__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果订阅者尝试设置非法的选项组, 服务必须(MUST)应答一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 64. 服务对于非法选项应答错误请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' id='options2'&amp;gt;&lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
  &amp;lt;options node='princely_musings' jid='francisco@denmark.lit'&amp;gt;&lt;br /&gt;
   &amp;lt;x xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
     &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
   &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
 &amp;lt;error type='modify'&amp;gt; &lt;br /&gt;
  &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt; &lt;br /&gt;
  &amp;lt;invalid-options xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt; &lt;br /&gt;
 &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其他适用于获取订阅选项时发生的错误也同样适用于设置订阅选项的情形.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
大家直到, 如果一个服务支持订阅选项, 一个实体可以(MAY)在同一个节中订阅和提供订阅选项.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主意: &amp;lt;options/&amp;gt;元素必须(MUST)跟随在&amp;lt;subscribe/&amp;gt;元素之后并且不能(MUST NOT)拥有一个'node'属性或'jid'属性, 因为&amp;lt;subscribe/&amp;gt;元素的'node'属性值指明了期望的NodeID并且&amp;lt;subscribe/&amp;gt;元素的'jid'属性值指明了订阅者的JID; 如果这些值中的任何一个违规了, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 65. 实体订阅一个节点并且设置配置选项__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='sub1'&amp;gt; &lt;br /&gt;
 &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt; &lt;br /&gt;
  &amp;lt;subscribe node='princely_musings' jid='francisco@denmark.lit'/&amp;gt; &lt;br /&gt;
   &amp;lt;options&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data'&amp;gt; &lt;br /&gt;
     &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;http://jabber.org/protocol/pubsub#subscribe_options&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#deliver'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;field var='pubsub#digest'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#include_body'&amp;gt;&lt;br /&gt;
      &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt;&lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
     &amp;lt;field var='pubsub#show-values'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;chat&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;online&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;away&amp;lt;/value&amp;gt; &lt;br /&gt;
     &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
   &amp;lt;/options&amp;gt; &lt;br /&gt;
 &amp;lt;/pubsub&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__6.4 从节点接收条目__ {anchor:从节点接收条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
选择保留条目的pubsub实现可以(MAY)允许实体从一个节点请求已有的条目(例如, 一个实体可能希望在成功订阅之后这样做以接收这个节点历史上发行的所有条目). 服务必须(MUST)遵守节点访问模式来决定是否向请求它们的实体返回这些条目. 具体来说:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;open&amp;quot;, 服务应该(SHOULD)允许任何实体(无论是否订阅)接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;presence&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;roster&amp;quot;, 服务应该(SHOULD)允许任何已订阅这个所有者的出席信息并处于适当的名册组中的实体接收条目.&lt;br /&gt;
&lt;br /&gt;
    * 如果访问模式是&amp;quot;authorize&amp;quot;或&amp;quot;whitelist&amp;quot;, 服务必须(MUST)只允许已订阅的实体来接收条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于将来的访问模式所应有(SHOULD)的需求, 可能的例外是强制本地隐私和安全策略, 更全面的描述见本文的安全事项章节. (另外, 一个服务应该(MUST)总是允许节点所有者从一个节点接收条目并且应该(SHOULD)总是允许一个发行者这样做.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
订阅者可以通过仅仅不加限制地指明节点ID来请求所有的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 66. 订阅者请求所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务然后应该(SHOULD)返回所有发行到这个节点的条目, 尽管它可以(MAY)截取结果(如果已发行的条目数量太多的话).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 67. 服务返回所有条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='3300659945416e274474e469a1f0154c'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Ghostly Encounters&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O all you host of heaven! O earth! what else?&lt;br /&gt;
And shall I couple hell? O, fie! Hold, hold, my heart;&lt;br /&gt;
And you, my sinews, grow not instant old,&lt;br /&gt;
But bear me stiffly up. Remember thee!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T23:21:34Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T23:21:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
即使服务或节点不支持持久化条目, 它也可以(MAY)返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 68. 服务返回最后发行的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
有很多种原因可能导致条目接收请求失败:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体订阅了但是指定了一个非法的订阅项ID.&lt;br /&gt;
&lt;br /&gt;
   1. 节点没有返回条目给未订阅的实体但是请求实体未曾订阅.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持持久条目并且没有返回最后发行的条目.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点不支持条目接收.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;presence&amp;quot;访问模式而请求实体没有订阅所有者的出席信息.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;roster&amp;quot;访问模式而请求实体不在授权的名册组中.&lt;br /&gt;
&lt;br /&gt;
   1. 节点有一个&amp;quot;whitelist&amp;quot;访问模式而请求实体不在白名单中.&lt;br /&gt;
&lt;br /&gt;
   1. 服务或节点需要付费才允许接收条目.&lt;br /&gt;
&lt;br /&gt;
   1. 请求实体被屏蔽了从节点接收条目的功能(例如, 因为有一个排斥者的从属关系).&lt;br /&gt;
&lt;br /&gt;
   1. 节点不存在.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些错误完整描述如下.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体对同一个节点有多个订阅项但是没有指定一个订阅项ID, 服务必须(MUST)返回一个&amp;lt;bad-request/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;subid-required/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 69. 实体未指定SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果请求实体订阅了但是指定了一个非法的订阅项ID, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;invalid-subid/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 70. 实体制定了非法的SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-subid xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点未返回条目给未订阅的实体并且请求实体未曾订阅(包含已有一个未决的订阅项的情形), 服务必须(MUST)返回一个&amp;lt;not-authorized/&amp;gt;错误给订阅者, 它也应该(SHOULD)包含一个&amp;lt;not-subscribed/&amp;gt;的pubsub-specific错误条件.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 71. 实体未订阅__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持持久条目且没有返回最后发行的条目, 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指定一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 72. 不支持持久条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果服务或节点不支持接收条目(例如, 因为节点是一个集合节点), 服务必须(MUST)返回一个&amp;lt;feature-not-implemented/&amp;gt;错误给订阅者, 指明一个pubsub-specific错误条件&amp;lt;unsupported/&amp;gt;以及一个特性&amp;quot;retrieve-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 73. 不支持条目接收__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='retrieve-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;presence&amp;quot;的节点, 如果请求实体没有订阅所有者的出席信息那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它还应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;presence-subscription-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 74. 实体没有被授权接收条目(要求订阅出席信息)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;presence-subscription-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;roster&amp;quot;的节点, 如果请求实体不在授权名册组中那么pubsub服务必须(MUST)应答一个&amp;lt;not-authorized/&amp;gt;错误, 它也应该(SHOULD)包含一个pubsub-specific错误条件&amp;lt;not-in-roster-group/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 75. 实体没有被授权接收条目(不在名册组中)__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;not-in-roster-group xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于访问模式为&amp;quot;whitelist&amp;quot;的节点, 如果请求实体不在白名单中那么服务必须(MUST)返回一个&amp;lt;not-allowed/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;closed-node/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 76. 节点有白名单模式__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;closed-node xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
商业开发可能希望把订阅者链接到一个付费客户数据库. 如果订阅者需要付费才能从那个节点接收条目(例如, 如果订阅者不在客户数据库或客户的帐目没有付清), 服务应该(SHOULD)返回一个&amp;lt;payment-required/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 77. 需要付费才能接收条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;payment-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果请求实体被屏蔽订阅(例如, 因为有一个被排斥者的从属关系), 服务必须(MUST)返回一个&amp;lt;forbidden/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 78. 请求实体被屏蔽__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果节点不存在, 服务应该(SHOULD)返回一个&amp;lt;item-not-found/&amp;gt;错误给订阅者.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 79. 节点不存在__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一个服务可能(MAY)允许实体请求最近的N个条目(使用'max_items'属性). 当 max_items 被使用, 实现应该(SHOULD)返回N个最新的(反之则是N个最旧的)条目. (注意: 一个本协议的未来版本可能建议使用结果集管理Result Set Management \[17\] 替代'max_items'属性.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 80. 订阅者请求两个最新的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings' max_items='2'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 81. 服务返回最新的两个条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='francisco@denmark.lit/barracks'&lt;br /&gt;
    id='items2'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
服务可以(MAY)返回事件通知而不是载荷(例如, 为了节省带宽). 如果这样, 客户端为了接收载荷可以(MAY)请求一个指定的条目(使用ItemID). 当一个实体通过ItemID来请求条目, 实现必须(MUST)允许在请求中指定多个条目.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 82. 订阅者通过ItemID请求特定的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'/&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 83. 服务发送请求的条目__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items3'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='368866411b877c30064a5f62b917cffe'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;The Uses of This World&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
O, that this too too solid flesh would melt&lt;br /&gt;
Thaw and resolve itself into a dew!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-12T17:47:23Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-12T17:47:23Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
      &amp;lt;item id='4e30f35051b7b8b42abe083742187228'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Alone&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
Now I am alone.&lt;br /&gt;
O, what a rogue and peasant slave am I!&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32396&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T11:09:53Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T11:09:53Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果一个订阅项标识符和某个特定的订阅项相关, 服务必须(MUST)要求它, 这样它能基于和这一特定的订阅项相关的订阅选项来生成不同套的条目. 所以实体作出请求的时候必须(MUST)在itmes元素中包含'subid'属性; 如果它没有这样做, 服务必须(MUST)返回一个&amp;lt;not-acceptable/&amp;gt;错误, 指明一个pubsub-specific错误条件&amp;lt;subid-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__案例 84. 订阅者不带SubID发送请求__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='get'&lt;br /&gt;
    from='francisco@denmark.lit/barracks'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
__案例 85. 要求SubID__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='items5'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;subid-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7. 发行者用例__ {anchor:发行者用例}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__7.1 向一个节点发行一个条目__ {anchor:向一个节点发行一个条目}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
任何被允许向一个节点发行条目的实体 (也就是说.,一个发行者或一个所有者) 可以通过发送一个包含&amp;lt;publish/&amp;gt;子元素的 IQ-set 给服务来做到这一点; 这个 &amp;lt;publish/&amp;gt; 元素必须( MUST)拥有一个 'node' 属性并且根据这个节点配置可以(MAY)不包含 &amp;lt;item/&amp;gt;元素, 一个 &amp;lt;item/&amp;gt; 元素, 或 (用于批量处理)多个 &amp;lt;item/&amp;gt; 元素.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意: 为触发一个通知不必要在发行请求中包含载荷或甚至一个 &amp;lt;item/&amp;gt; 元素.  例如, 发行到一个临时的仅用于通知的节点的结果将是一个不包含任何 &amp;lt;item/&amp;gt; 元素的通知 (如本文的Motivating Example章节所示). However, for the sake of convenience we refer to the act of publication as &amp;quot;publishing an item&amp;quot; (rather than, say, &amp;quot;triggering a notification&amp;quot;) even though a publication request will not always contain an &amp;lt;item/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 86. Publisher publishes an item with an ItemID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the pubsub service can successfully process the request, it MUST inform the publisher of success.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 87. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/blogbot'&lt;br /&gt;
    id='publish1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
If the pubsub service can successfully process the request, it MUST send then one &amp;lt;message/&amp;gt; stanza containing a pubsub event notification to each approved subscriber. Each &amp;lt;message/&amp;gt; stanza generated by a pubsub service SHOULD possess an 'id' attribute with a unique value so that the service can properly track any notification-related errors that may occur (see the Handling Notification-Related Errors section of this document).&lt;br /&gt;
Depending on the node configuration, the event notification either will or will not contain the payload, as shown in the following examples.&lt;br /&gt;
If the node is configured to include payloads, the subscribers will receive payloads with the event notifications.&lt;br /&gt;
Example 88. Subscribers receive event notifications with payloads&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;br /&gt;
          &amp;lt;title&amp;gt;Soliloquy&amp;lt;/title&amp;gt;&lt;br /&gt;
          &amp;lt;summary&amp;gt;&lt;br /&gt;
To be, or not to be: that is the question:&lt;br /&gt;
Whether 'tis nobler in the mind to suffer&lt;br /&gt;
The slings and arrows of outrageous fortune,&lt;br /&gt;
Or to take arms against a sea of troubles,&lt;br /&gt;
And by opposing end them?&lt;br /&gt;
          &amp;lt;/summary&amp;gt;&lt;br /&gt;
          &amp;lt;link rel='alternate' type='text/html'&lt;br /&gt;
                href='http://denmark.lit/2003/12/13/atom03'/&amp;gt;&lt;br /&gt;
          &amp;lt;id&amp;gt;tag:denmark.lit,2003:entry-32397&amp;lt;/id&amp;gt;&lt;br /&gt;
          &amp;lt;published&amp;gt;2003-12-13T18:30:02Z&amp;lt;/published&amp;gt;&lt;br /&gt;
          &amp;lt;updated&amp;gt;2003-12-13T18:30:02Z&amp;lt;/updated&amp;gt;&lt;br /&gt;
        &amp;lt;/entry&amp;gt;&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node is configured to not include payloads, the subscribers will receive event notifications only. (If payloads are not included, subscribers may request the published item via the protocol defined in the Retrieve Items from a Node section of this document.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 89. Subscribers receive event notifications only&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='horatio@denmark.lit' id='baz'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='marcellus@denmark.lit' id='fez'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to a node multiple times, the service SHOULD notate the event notification so that the entity can determine which subscription identifier(s) generated this event. If these notations are included, they MUST use the Stanza Headers and Internet Metadata [18] format and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 90. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the publish request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The requesting entity does not have sufficient privileges to publish.&lt;br /&gt;
&lt;br /&gt;
   2. The node does not support item publication.&lt;br /&gt;
&lt;br /&gt;
   3. The node does not exist.&lt;br /&gt;
&lt;br /&gt;
   4. The payload size exceeds a service-defined limit.&lt;br /&gt;
&lt;br /&gt;
   5. The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.&lt;br /&gt;
&lt;br /&gt;
   6. The request does not match the node configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: If a publisher publishes an item with an Item ID and the ItemID matches that of an existing item, the pubsub service MUST NOT fail the publication but instead MUST overwrite the existing item and generate a new event notification (i.e., re-publication is equivalent to modification).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to publish, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 91. Entity does not have sufficient privileges to publish to node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support item publication (because it is a Collection Node), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;publish&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 92. Node does not support item publication&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='publish'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity attempts to publish an item to a node that does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 93. Entity attempts to publish to a non-existent node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the payload size exceeds a service-defined limit, the service MUST return a &amp;lt;not-acceptable/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;payload-too-big/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 94. Entity attempts to publish very large payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... HUGE PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-too-big xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;item/&amp;gt; element contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node, the service MUST bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;invalid-payload/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 95. Entity attempts to publish item with multiple payload elements or namespace does not match&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'&amp;gt;&lt;br /&gt;
        ... INVALID PAYLOAD ...&lt;br /&gt;
      &amp;lt;/item&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;invalid-payload xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not conform to the configured event type for the node, the service MAY bounce the request with a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition. The following rules apply:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not specify an ItemID, the service MUST generate the ItemID and MUST NOT bounce the publication request.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is persistent (either notification or payload) and the publisher does not include an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is payload (either persistent or transient) and the publisher does not include a payload, the service SHOULD bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;payload-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    * If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a &amp;lt;bad-request/&amp;gt; error and a pubsub-specific error condition of &amp;lt;item-forbidden/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of these errors are shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 96. Publisher attempts to publish to persistent node with no item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 97. Publisher attempts to publish to payload node with no payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 98. Publisher attempts to publish to transient notification node with item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='publish1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;publish node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/publish&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-forbidden xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, in order to facilitate authorization for item removal as described in the Delete an Item from a Node section of this document, implementations that support persistent items SHOULD store the item (if the node is so configured) and maintain a record of the publisher.&lt;br /&gt;
&lt;br /&gt;
7.2 Delete an Item from a Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The &amp;lt;retract/&amp;gt; element MUST possess a 'node' attribute, MAY possess a 'notify' attribute, and SHOULD contain one &amp;lt;item/&amp;gt; element (but MAY contain more than one &amp;lt;item/&amp;gt; element for Batch Processing of item retractions); the &amp;lt;item/&amp;gt; element MUST be empty and MUST possess an 'id' attribute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 99. Entity deletes an item from a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='set'&lt;br /&gt;
    from='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    to='pubsub.shakespeare.lit'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 100. Service replies with success&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are several reasons why the item retraction request might fail:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   1. The publisher does not have sufficient privileges to delete the requested item.&lt;br /&gt;
&lt;br /&gt;
   2. The node or item does not exist.&lt;br /&gt;
&lt;br /&gt;
   3. The request does not specify a node.&lt;br /&gt;
&lt;br /&gt;
   4. The request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID.&lt;br /&gt;
&lt;br /&gt;
   5. The node does not support persistent items.&lt;br /&gt;
&lt;br /&gt;
   6. The service does not support the deletion of items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These error cases are described more fully below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the requesting entity does not have sufficient privileges to delete the item, the service MUST return a &amp;lt;forbidden/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 101. Requesting entity does not have sufficient privileges&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='auth'&amp;gt;&lt;br /&gt;
    &amp;lt;forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node or item does not exist, the service MUST return an &amp;lt;item-not-found/&amp;gt; error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 102. Non-existent node or item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not specify a node, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;node-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 103. Request does not specify a node&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;node-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the request does not include an &amp;lt;item/&amp;gt; element or the &amp;lt;item/&amp;gt; element does not specify an ItemID, the service MUST return a &amp;lt;bad-request/&amp;gt; error, which SHOULD also include a pubsub-specific error condition of &amp;lt;item-required/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 104. Request does not specify an item&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'/&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='modify'&amp;gt;&lt;br /&gt;
    &amp;lt;bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;item-required xmlns='http://jabber.org/protocol/pubsub#errors'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the node does not support persistent items (e.g., because it is a collection node or a transient node that does not deliver payloads), the service MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;persistent-items&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 105. Node does not support persistent items&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='persistent-items'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the service does not support item deletion, it MUST return a &amp;lt;feature-not-implemented/&amp;gt; error, specifying a pubsub-specific error condition of &amp;lt;unsupported/&amp;gt; and a feature of &amp;quot;delete-nodes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 106. Service does not support item deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='error'&lt;br /&gt;
    from='pubsub.shakespeare.lit'&lt;br /&gt;
    to='hamlet@denmark.lit/elsinore'&lt;br /&gt;
    id='retract1'&amp;gt;&lt;br /&gt;
  &amp;lt;pubsub xmlns='http://jabber.org/protocol/pubsub'&amp;gt;&lt;br /&gt;
    &amp;lt;retract node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;item id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/retract&amp;gt;&lt;br /&gt;
  &amp;lt;/pubsub&amp;gt;&lt;br /&gt;
  &amp;lt;error type='cancel'&amp;gt;&lt;br /&gt;
    &amp;lt;feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
    &amp;lt;unsupported xmlns='http://jabber.org/protocol/pubsub#errors'&lt;br /&gt;
                 feature='delete-nodes'/&amp;gt;&lt;br /&gt;
  &amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred, then the service MUST delete the item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If none of the foregoing errors occurred and the &amp;lt;retract/&amp;gt; element included a 'notify' attribute with a value of &amp;quot;true&amp;quot; or &amp;quot;1&amp;quot; [19], then the service MUST delete the item and MUST send message notifications to all subscribers as shown below. The syntax is identical to publish notifications except that instead of an &amp;lt;item/&amp;gt; element, the notification includes a &amp;lt;retract/&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 107. Subscribers are notified of deletion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a single entity is subscribed to the node multiple times, the service SHOULD notate the notification of item deletion so that the entity can determine which subscription identifier(s) generated this event. As above, if these notations are included, they MUST use the Stanza Headers and Internet Metadata (SHIM) protocol and SHOULD be included after the event notification information (i.e., as the last child of the &amp;lt;message/&amp;gt; stanza).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 108. Subscriber receives notated event notification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;message from='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'&amp;gt;&lt;br /&gt;
  &amp;lt;event xmlns='http://jabber.org/protocol/pubsub#event'&amp;gt;&lt;br /&gt;
    &amp;lt;items node='princely_musings'&amp;gt;&lt;br /&gt;
      &amp;lt;retract id='ae890ac52d0df67ed7cfdf51b644e901'/&amp;gt;&lt;br /&gt;
    &amp;lt;/items&amp;gt;&lt;br /&gt;
  &amp;lt;/event&amp;gt;&lt;br /&gt;
  &amp;lt;headers xmlns='http://jabber.org/protocol/shim'&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;123-abc&amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;header name='pubsub#subid'&amp;gt;004-yyy&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;/headers&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[:Category:XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0060&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2006-09-13&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[RFC3920|XMPP Core]], XEP-0004, XEP-0030, XEP-0068, XEP-0082, XEP-0131&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: pubsub&lt;br /&gt;
&lt;br /&gt;
pubsub 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#errors 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-errors.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#event 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-event.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pubsub#owner 名字空间的XML方案: &amp;lt;http://www.xmpp.org/schemas/pubsub-owner.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiki 页: &amp;lt;http://wiki.jabber.org/index.php/Publish-Subscribe%20(XEP-0060)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Millard'''&lt;br /&gt;
&lt;br /&gt;
见[http://www.xmpp.org/extensions/xep-0060.html#authornote 作者介绍]&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''Ralph Meijer'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
&lt;br /&gt;
:JID: [xmpp:ralphm@ik.nu ralphm@ik.nu]&lt;br /&gt;
[http://essay-writer.org/ essay writers]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/RFC6120</id>
		<title>RFC6120</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/RFC6120"/>
				<updated>2011-11-09T03:52:29Z</updated>
		
		<summary type="html">&lt;p&gt;How: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP相关RFC]]&lt;br /&gt;
[[Category:XMPP核心RFC]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;本文的英文原文来自[http://xmpp.org/rfcs/rfc6120.html RFC 6120]&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;65%&amp;quot;&lt;br /&gt;
|互联网工程任务组(IETF) || P. Saint-Andre&lt;br /&gt;
|-&lt;br /&gt;
|申请讨论: 6120 || Cisco&lt;br /&gt;
|-&lt;br /&gt;
|取代: 3920 || 2011年3月&lt;br /&gt;
|-&lt;br /&gt;
|类别: 标准跟踪 || &lt;br /&gt;
|-&lt;br /&gt;
|ISSN: 2070-1721 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:::'''可扩展的消息和出席信息协议 (XMPP): 核心协议'''&lt;br /&gt;
&lt;br /&gt;
'''摘要'''&lt;br /&gt;
&lt;br /&gt;
:可扩展的消息和出席信息协议(XMPP)是一个XML应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互. 本文取代了 RFC 3920.&lt;br /&gt;
&lt;br /&gt;
'''本文的状态'''&lt;br /&gt;
&lt;br /&gt;
:这是一个互联网标准跟踪文档.&lt;br /&gt;
&lt;br /&gt;
:本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.&lt;br /&gt;
&lt;br /&gt;
:关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈，请到 http://www.rfc-editor.org/info/rfc6120 .&lt;br /&gt;
&lt;br /&gt;
'''版权通知'''&lt;br /&gt;
&lt;br /&gt;
:Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.&lt;br /&gt;
&lt;br /&gt;
:This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.&lt;br /&gt;
&lt;br /&gt;
==序论==&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
可扩展的消息和出席信息协议(XMPP)是一个可扩展标记语言[[RFC6120#XML|XML]]应用，让任何两个或多个网络实体之间进行结构化和可扩展的准实时信息交流. 本文定义了XMPP的核心协议方法: XML流的配置和解除, 通道加密, 验证, 错误处理, 以及消息通讯基础, 网络可用性 (&amp;quot;presence&amp;quot;), 和 请求-应答 交互.&lt;br /&gt;
&lt;br /&gt;
===历史===&lt;br /&gt;
&lt;br /&gt;
XMPP的基本语法和语义最开始是由Jabber开源社区开发的, 主要是在1999年. 2002年, 根据 [[RFC6120#IMP‑REQS|IMP‑REQS]] ，XMPP工作组被允许基于Jabber协议开发一个适合IETF的即时消息和出席信息技术. 到了2004年10月, 发布了 [[RFC3920]] 和 [[RFC3921]] , 意味着那时候XMPP的主要定义完成了.&lt;br /&gt;
&lt;br /&gt;
从2004年开始，互联网社区已经获得了广泛的XMPP实现和布署经验, 包括XMPP标准基金会(XSF)主持下开展的正式的互操作性测试. 本文全面整合了从软件开发者和XMPP服务提供者得到的反馈, 包含了一系列向后兼容的修改，见 [[RFC6120#附录D:和RFC3920的不同|附录D]] . 结果是, 本文反映了互联网社区对于XMPP1.0核心功能的初步共识, 因此废止了RFC 3920.&lt;br /&gt;
&lt;br /&gt;
===功能汇总===&lt;br /&gt;
&lt;br /&gt;
这个不规范的章节提供了一个方便开发者的XMPP功能汇总; 接下来的其他章节则是XMPP的规范定义.&lt;br /&gt;
&lt;br /&gt;
XMPP的目标是允许两个(或多个)实体通过网络来交换相关的小件结构化数据(所谓&amp;quot;XML节&amp;quot;). XMPP典型地使用分布式的 客户端-服务器 体系结构来实现, 这里客户端需要连接到一个服务器以获得对网络的访问，从而被允许和其他实体(可能在其他服务器上)交换XML节. 一个客户端连接到一个服务器，交换XML节，以及结束连接，这样的流程如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个传输控制协议 [[RFC6120#TCP|TCP]] 连接&lt;br /&gt;
# 通过TCP打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用传输层安全性 [[RFC6120#TLS|TLS]] 来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] )&lt;br /&gt;
# 绑定一个资源到这个留上 ( [[RFC6120#资源绑定|7]] )&lt;br /&gt;
# 和其他网络上的实体交换不限数量的XML节( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
在XMPP中, 一个服务器可以选择性地连接到另一个服务器以激活域间或服务器间的通讯. 这种情形下, 两个服务器需要在他们自身之间建立一个连接然后交换XML节; 这个过程所做的事情如下: &lt;br /&gt;
&lt;br /&gt;
# 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( [[RFC6120#合格域名的解析|3.2]] )&lt;br /&gt;
# 打开一个TCP连接&lt;br /&gt;
# 打开一个XML流 [[RFC6120#打开一个流|4.2]]&lt;br /&gt;
# 握手最好使用TLS来进行通道加密( [[RFC6120#STARTTLS握手|5]] )&lt;br /&gt;
# 使用简单验证和安全层 [[RFC6120#SASL|SASL]] 机制来验证 ( [[RFC6120#SASL握手|6]] ) *&lt;br /&gt;
# 交换不限数量的XML节，可以服务器之间直接交换，也可以代表每台服务器上的相关实体来交换，例如那些连到服务器上的客户端 ( [[RFC6120#XML节|8]] )&lt;br /&gt;
# 关闭XML流 ( [[RFC6120#关闭一个流|4.4]] )&lt;br /&gt;
# 关闭TCP连接&lt;br /&gt;
&lt;br /&gt;
* 互操作性提示: 在本文写就的时候, 大多数已布署的服务器仍使用服务器回拨协议 [[RFC6120#XEP‑0220|XEP‑0220]] 来提供弱身份验证，而不是使用SASL的 PKIX证书来提供强验证, 特别在这些情况下，SASL握手无论如何将不会得到强验证 (例如, 因为TLS握手没有被对方服务器强制要求, 或因为当TLS握手时对方服务器提供的PKIX证书是自签名的并且之前没有被接受过); 细节请见 [[RFC6120#XEP‑0220|XEP‑0220]] . 本文的解决方案显然提供了一个更高级别的安全性 (参见  [[RFC6120#高安全性|13.6]] ).&lt;br /&gt;
&lt;br /&gt;
本文指定了客户端如何连接到服务器以及基本的XML节语义. 然而, 本文不定义一个连接成功建立之后可能用来交换的XML节的&amp;quot;载荷&amp;quot;; 反之, 那些载荷被定义在各种XMPP扩展之中. 例如, [[RFC6120#XMPP‑IM|XMPP‑IM]] 定义了基本的即时消息和出席信息功能的扩展. 另外, XSF创造了各种扩展协议，即XEP系列  [[RFC6120#XEP‑0001|XEP‑0001]] ,也为广泛的应用程序定义了扩展.&lt;br /&gt;
&lt;br /&gt;
===术语===&lt;br /&gt;
&lt;br /&gt;
本文中的关键字 &amp;quot;MUST&amp;quot;, &amp;quot;MUST NOT&amp;quot;, &amp;quot;REQUIRED&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;SHALL NOT&amp;quot;, &amp;quot;SHOULD&amp;quot;, &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;, &amp;quot;MAY&amp;quot;, 和 &amp;quot;OPTIONAL&amp;quot; 的解释参见RFC 2119 [[RFC6120#关键字|关键字]] .&lt;br /&gt;
&lt;br /&gt;
特定的安全相关的术语的含义参见 [[RFC6120#安全术语|安全术语]] ; 这些术语包括但不限于, &amp;quot;assurance&amp;quot;, &amp;quot;attack&amp;quot;, &amp;quot;authentication&amp;quot;, &amp;quot;authorization&amp;quot;, &amp;quot;certificate&amp;quot;, &amp;quot;certification authority&amp;quot;, &amp;quot;certification path&amp;quot;, &amp;quot;confidentiality&amp;quot;, &amp;quot;credential&amp;quot;, &amp;quot;downgrade&amp;quot;, &amp;quot;encryption&amp;quot;, &amp;quot;hash value&amp;quot;, &amp;quot;identity&amp;quot;, &amp;quot;integrity&amp;quot;, &amp;quot;signature&amp;quot;, &amp;quot;self-signed certificate&amp;quot;, &amp;quot;sign&amp;quot;, &amp;quot;spoof&amp;quot;, &amp;quot;tamper&amp;quot;, &amp;quot;trust&amp;quot;, &amp;quot;trust anchor&amp;quot;, &amp;quot;validate&amp;quot;, and &amp;quot;verify&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
特定的和证书，域名，应用服务身份相关的术语参见 [[RFC6120#TLS‑证书|TLS‑证书]] ; 这包括但不限于, &amp;quot;PKIX certificate&amp;quot;, &amp;quot;source domain&amp;quot;, &amp;quot;derived domain&amp;quot;, 以及身份类型 &amp;quot;CN-ID&amp;quot;, &amp;quot;DNS-ID&amp;quot;, 和 &amp;quot;SRV-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
其他安全相关的术语定义于参考协议中 (例如, &amp;quot;denial of service&amp;quot; (拒绝服务)定义于 [[RFC6120#DOS|DOS]] 或 &amp;quot;end entity certificate&amp;quot; (终端实体证书)定义于 [[RFC6120#PKIX|PKIX]] ).&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;whitespace&amp;quot; (空格) 用于指代 [[RFC6120#XML|XML]] 中任何匹配&amp;quot;S&amp;quot;的字符或字符串, 也就是说, 一个或多个满足 [[RFC6120#ABNF|ABNF]] 定义的SP, HTAB, CR, 或 LF 规则的实例.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;localpart&amp;quot; (本地部分), &amp;quot;domainpart&amp;quot; (域部分), 以及 &amp;quot;resourcepart&amp;quot; (资源部分)定义于 [[RFC6120#XMPP地址|XMPP地址]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;bare JID&amp;quot; (纯JID) 指代一个格式为 &amp;lt;localpart@domainpart&amp;gt; (对于一个位于某个服务器上的帐户而言) 或 &amp;lt;domainpart&amp;gt; (对于一个服务器而言) 的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;full JID&amp;quot; (全JID) 指代一个格式为 &amp;lt;localpart@domainpart/resourcepart&amp;gt; (对一个典型的已授权客户端或和某个帐号相关的设备而言) 或 &amp;lt;domainpart/resourcepart&amp;gt; (对于一个典型的资源或和某个服务器相关的文字)的XMPP地址.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stream&amp;quot; (也称为 &amp;quot;stream&amp;quot; (流)) 定义于 [[RFC6120#流的基本原理|4.1]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;XML stanza&amp;quot; (也称为 &amp;quot;stanza&amp;quot; (节)) 定义于 [[RFC6120#流的基本原理|4.1]] . 有三种 stanzas（节）: message, presence, 和 IQ (&amp;quot;Info/Query&amp;quot;的简称). 这些通讯原语分别定义于 [[RFC6120#Message语义|8.2.1]] , [[RFC6120#Presence语义|8.2.2]] , 和 [[RFC6120#IQ语义|8.2.3]] .&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;originating entity&amp;quot; (原实体)指的是第一次生成一个发送到XMPP网络的stanza(节)的实体(例如, 一个已连接的客户端, 一个附加的服务, 或一个服务器). 术语 &amp;quot;generated stanza&amp;quot; (生成的节)值的是生成的节那个节.&lt;br /&gt;
&lt;br /&gt;
术语 &amp;quot;input stream&amp;quot; (输入流)指定这样一个XML流，服务器通过这个流从一个已连接的客户端或远端服务器接收数据, 而术语 &amp;quot;output stream&amp;quot; (输出流)指定这样一个流，服务器通过这个流发送数据到一个已连接的客户端或远程服务器. 以下术语指定一些动作，处理从输入流收到的数据时服务器可以执行这些动作:&lt;br /&gt;
&lt;br /&gt;
        route(路由):&lt;br /&gt;
            传递数据到一个远端服务器让它自行处理或最终递送到一个和远端服务器关联的客户端&lt;br /&gt;
        deliver(递送):&lt;br /&gt;
            传递数据到一个已连接的客户端&lt;br /&gt;
        ignore(忽略):&lt;br /&gt;
            丢弃数据不做任何处理或返回一个错误给发送者sender &lt;br /&gt;
&lt;br /&gt;
当术语 &amp;quot;ignore&amp;quot; (忽略)用于客户端处理收到的数据时, 短语 &amp;quot;without acting upon it&amp;quot; (不做任何处理)明确的包括不展示任何数据给使用者(人).&lt;br /&gt;
&lt;br /&gt;
接下来的 &amp;quot;XML符号&amp;quot; 被 [[RFC6120#IRI|IRI]] 用于展示无法用仅用ASCII码呈现的字符, 本文的一些例子使用了类似 &amp;quot;&amp;amp;#x....&amp;quot; 的格式来表现 [[RFC6120#UNICODE|UNICODE]] 字符串 (例如, 字符串 &amp;quot;&amp;amp;#x0159;&amp;quot; 表示Unicode字符 LATIN SMALL LETTER R WITH CARON); 这种形式是绝对不会在XMPP系统将通过网络发送的.&lt;br /&gt;
&lt;br /&gt;
和 [[RFC6120#URI|URI]] 展现统一资源定位符的规则一样, XMPP地址文本也是用 '&amp;lt;' 和 '&amp;gt;' 括起来的(尽管基本上它们不属于 URIs).&lt;br /&gt;
&lt;br /&gt;
例如, 被括起来的行是用来提高可读性的, &amp;quot;[...]&amp;quot; 表示省略, 并且还是用了以下预定义字符串 (这些预定义的字符串不会通过网络发送出去):&lt;br /&gt;
&lt;br /&gt;
* C: = 客户端&lt;br /&gt;
* E: = 任何XMPP实体&lt;br /&gt;
* I: = 发起实体&lt;br /&gt;
* P: = 对端服务器&lt;br /&gt;
* R: = 接收实体&lt;br /&gt;
* S: = 服务器&lt;br /&gt;
* S1: = 服务器1&lt;br /&gt;
* S2: = 服务器2&lt;br /&gt;
&lt;br /&gt;
读者需要注意这些例子不包括细节, 并且例子里的一些协议流程中, 展示的备用步骤不一定是由前一个步骤发送的确切的数据触发的; in all cases the protocol definitions specified in this document or in normatively referenced documents rule over any examples provided here. All examples are fictional and the information exchanged (e.g., usernames and passwords) does not represent any existing users or servers.&lt;br /&gt;
&lt;br /&gt;
==体系结构==&lt;br /&gt;
===全局地址===&lt;br /&gt;
===出席信息===&lt;br /&gt;
===持久的流===&lt;br /&gt;
===结构化数据===&lt;br /&gt;
===客户端和服务器的分布式网络===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-05-31T07:25:57Z</updated>
		
		<summary type="html">&lt;p&gt;How: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;br /&gt;
&lt;br /&gt;
''authreg'' 段落解决客户端验证和注册的问题:&lt;br /&gt;
&lt;br /&gt;
* 验证包&lt;br /&gt;
* 公开注册&lt;br /&gt;
* 密码修改&lt;br /&gt;
* 验证机制&lt;br /&gt;
* 验证包配置&lt;br /&gt;
&lt;br /&gt;
这些子段落描述如下.&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
''module'' 子段落指定所使用的验证数据包. Jabberd根据你编译时候参数的选择来设置这个 ''module'' , 所以你应该不需要编辑它，除非你要在安装Jabberd之后修改验证数据包.&lt;br /&gt;
&lt;br /&gt;
====公开注册====&lt;br /&gt;
&lt;br /&gt;
''register'' 子段落下的 ''enable'' 控制是否允许新用户的公开注册. 公开注册缺省是允许的. 注释掉这个 ''enable'' 标签可以禁止公开注册.&lt;br /&gt;
&lt;br /&gt;
====密码修改====&lt;br /&gt;
&lt;br /&gt;
''register'' 下的 ''password'' 段落规定是否允许用户修改他们自己的密码. 密码修改缺省是禁止的. 如 ''c2s.xml'' 所提到的, 如果禁用了公开注册，那么允许修改密码可能是有用的.&lt;br /&gt;
&lt;br /&gt;
====验证机制====&lt;br /&gt;
&lt;br /&gt;
''mechanisms'' 子段落指定提供哪种验证加密方法给客户端. 如 ''c2s.xml'' 所述, 你应该注释掉任何不想提供的机制.&lt;br /&gt;
&lt;br /&gt;
====验证包配置====&lt;br /&gt;
&lt;br /&gt;
''authreg'' 的最后一个子段落控制你的验证数据包的连接. 缺省的设置对大部分人来说够用了，除非你的验证数据包运行在一个独立的服务器上.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section12/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Jabberd 2体系结构(草稿)==&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 本章还在创作中'''&lt;br /&gt;
&lt;br /&gt;
:注意本章是很大程度上还在创作中. 所以, 以下信息应该被视为草稿, Jabberd 2体系结构的并且不是最终描述. 基本上, 我加入这章是因为我正在学习Jabberd 2.&lt;br /&gt;
&lt;br /&gt;
|| 下一步打算: 为体系结构概述添加体系结构特性列表 -或- 只是新特性列表 ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
译者注：下文略。。。。。。原因之一是这章草稿似乎变成永久性的草稿了，原因之二是jabberd2后来被波兰人接手了，体系结构有一些改动，所以这章草稿也有点过时了，有可能会造成不必要的误导。&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-05-31T07:25:29Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Jabberd 2体系结构(草稿) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;br /&gt;
&lt;br /&gt;
''authreg'' 段落解决客户端验证和注册的问题:&lt;br /&gt;
&lt;br /&gt;
* 验证包&lt;br /&gt;
* 公开注册&lt;br /&gt;
* 密码修改&lt;br /&gt;
* 验证机制&lt;br /&gt;
* 验证包配置&lt;br /&gt;
&lt;br /&gt;
这些子段落描述如下.&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
''module'' 子段落指定所使用的验证数据包. Jabberd根据你编译时候参数的选择来设置这个 ''module'' , 所以你应该不需要编辑它，除非你要在安装Jabberd之后修改验证数据包.&lt;br /&gt;
&lt;br /&gt;
====公开注册====&lt;br /&gt;
&lt;br /&gt;
''register'' 子段落下的 ''enable'' 控制是否允许新用户的公开注册. 公开注册缺省是允许的. 注释掉这个 ''enable'' 标签可以禁止公开注册.&lt;br /&gt;
&lt;br /&gt;
====密码修改====&lt;br /&gt;
&lt;br /&gt;
''register'' 下的 ''password'' 段落规定是否允许用户修改他们自己的密码. 密码修改缺省是禁止的. 如 ''c2s.xml'' 所提到的, 如果禁用了公开注册，那么允许修改密码可能是有用的.&lt;br /&gt;
&lt;br /&gt;
====验证机制====&lt;br /&gt;
&lt;br /&gt;
''mechanisms'' 子段落指定提供哪种验证加密方法给客户端. 如 ''c2s.xml'' 所述, 你应该注释掉任何不想提供的机制.&lt;br /&gt;
&lt;br /&gt;
====验证包配置====&lt;br /&gt;
&lt;br /&gt;
''authreg'' 的最后一个子段落控制你的验证数据包的连接. 缺省的设置对大部分人来说够用了，除非你的验证数据包运行在一个独立的服务器上.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section12/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Jabberd 2体系结构(草稿)==&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 本章还在创作中'''&lt;br /&gt;
&lt;br /&gt;
:注意本章是很大程度上还在创作中. 所以, 以下信息应该被视为草稿, Jabberd 2体系结构的并且不是最终描述. 基本上, 我加入这章是因为我正在学习Jabberd 2.&lt;br /&gt;
&lt;br /&gt;
|| 下一步打算: 为体系结构概述添加体系结构特性列表 -或- 只是新特性列表 ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
译者注：下文略。。。。。。原因之一是这章草稿似乎变成永久性的草稿了，原因之二是jabberd2后来被波兰人接手了，体系结构有一些改动，所以这章草稿也有点过时了，有可能会造成不必要的误导。&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97</id>
		<title>Openfire:安装指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97"/>
				<updated>2011-05-30T09:20:26Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 安装概述 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html '''&lt;br /&gt;
&lt;br /&gt;
'''安装指南'''&lt;br /&gt;
&lt;br /&gt;
Openfire是一个强大的即时消息（IM）和聊天服务器，它实现了XMPP协议。这份文件将引导您通过安装Openfire。对于更多的功能和信息的完整列表，请访问Openfire网站：http://www.igniterealtime.org/projects/openfire/&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
运行Openfire 安装包. 应用缺省将被安装于目录 c:\Program Files\Openfire .&lt;br /&gt;
&lt;br /&gt;
===Linux/Unix===&lt;br /&gt;
&lt;br /&gt;
可选择RPM包或tar.gz包. 如果使用RPM包, 用你的包管理器运行把它Openfire安装到目录 /opt/openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpm -ivh openfire_3_0_0.rpm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果使用.tar.gz包, 解压到目录 /opt 或 /usr/bin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xzvf openfire_3_0_0.tar.gz&lt;br /&gt;
mv openfire /opt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''注意''': .tar.gz包不一定包含Java虚拟机(JRE). 所以, 你必须之前就有 JDK 或 JRE 1.5.0 (Java 5) 或之后安装到你的系统里. 你可以在命令行键入 &amp;quot;java -version&amp;quot; 来检查你的java版本，然后 (如果必要) 访问 http://java.sun.com 更新你的Java安装.&lt;br /&gt;
&lt;br /&gt;
==安装概述==&lt;br /&gt;
&lt;br /&gt;
为了完成Openfire的安装, 你需要执行以下步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Openfire:安装指南#安装数据库|数据库]] - 如果你选择使用一个外部数据库, 你必须准备为Openfire准备好你的数据库.&lt;br /&gt;
# [[Openfire:安装指南#安装服务器|安装]] - 使用内置的基于web的安装工具来安装和验证服务器的配置.&lt;br /&gt;
# [[Openfire:安装指南#管理控制台|管理控制台]] - 使用基于web的管理工具来管理服务器.&lt;br /&gt;
&lt;br /&gt;
本文也包括以下信息:&lt;br /&gt;
&lt;br /&gt;
* [[Openfire:安装指南#在Windows下运行Openfire|在Windows下运行]]&lt;br /&gt;
* [[Openfire:安装指南#在Linux/Unix下运行Openfire|在Unix/Linux下运行]]&lt;br /&gt;
* [[Openfire:安装指南#插件|安装和使用插件]]&lt;br /&gt;
&lt;br /&gt;
==分发版里的文件==&lt;br /&gt;
&lt;br /&gt;
你的分发版里的文件应该像下面这样 (为了简短一点，一些子目录被忽略了):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openfire/&lt;br /&gt;
 |- readme.html&lt;br /&gt;
 |- license.html&lt;br /&gt;
 |- conf/&lt;br /&gt;
 |- bin/&lt;br /&gt;
 |- jre/&lt;br /&gt;
 |- lib/&lt;br /&gt;
 |- plugins/&lt;br /&gt;
     |- admin/&lt;br /&gt;
 |- resources/&lt;br /&gt;
     |-database/&lt;br /&gt;
     |-security/&lt;br /&gt;
 |- documentation/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''conf''' 目录Openfire用来存放配置文件.&lt;br /&gt;
* '''bin''' 目录包含了服务器的可执行文件. 根据你安装的不同分发版, 可用的执行文件也不同.&lt;br /&gt;
* '''jre''' 目录包含了一个 Java 5 虚拟机，打包在Windows和RPM版本Openfire里面的.&lt;br /&gt;
* '''lib''' 目录包含了运行Openfire所需要的库.&lt;br /&gt;
* '''plugins''' 目录包含了服务器插件. 缺省地, Openfire带了一个基于web的管理控制台插件.&lt;br /&gt;
* '''resources/database''' 目录包含 SQL 架构文件，用来新建Openfire数据库, 以及已有安装的更新脚本.&lt;br /&gt;
* '''resources/security''' 目录是Openfire维护keystores的地方，用来支持SSL连接安全性.&lt;br /&gt;
* '''documentation''' 目录包含了服务器文档.&lt;br /&gt;
&lt;br /&gt;
==安装数据库==&lt;br /&gt;
&lt;br /&gt;
Openfire能把它的数据存储在一个嵌入式的数据库里，你也能选择使用一个外部数据库,例如MySQL或Oracle. 如果你喜欢使用外部数据库, 你必须在开始安装之前准备好它. 更多信息见[http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database.html 数据库安装].&lt;br /&gt;
&lt;br /&gt;
==安装服务器==&lt;br /&gt;
&lt;br /&gt;
Openfire內建了一个基于web的, &amp;quot;向导&amp;quot;驱动的安装和配置工具. 简单地启动Openfire(分平台的指引如下) 并使用浏览器连接到管理控制台. 基于web的管理控制台的缺省端口是9090. 如果你和Openfire在同一台机器, 以下URL通常会起作用: http://127.0.0.1:9090.&lt;br /&gt;
&lt;br /&gt;
==管理控制台==&lt;br /&gt;
&lt;br /&gt;
在完成上述步骤之后, Openfire将被配置，你可以用基于web的管理控制台管理服务器. URL应该和你用来安装服务器用的那个一样，除非你在安装期间修改了那个端口.&lt;br /&gt;
&lt;br /&gt;
==在Windows下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你使用了Openfire安装包, 在你的开始菜单里会有一个快捷方式来启动图形化启动器. 否则, 在你的 Openfire 安装位置的 bin/ 目录运行 openfire.exe . 在启动界面上有一个按钮，允许你自动打开你的web浏览器连接正确的URL来完成服务器的安装&lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/launcher.png&lt;br /&gt;
&lt;br /&gt;
===Windows服务===&lt;br /&gt;
&lt;br /&gt;
如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作为一个标准的Windows来运行. 如果你使用Windows安装包, 一个 openfire-service.exe 文件将会出现在安装目录下的 bin 目录. 你可以使用这个可执行文件来安装和控制Openfire服务.&lt;br /&gt;
&lt;br /&gt;
从控制台窗口, 你可以运行以下命令:&lt;br /&gt;
&lt;br /&gt;
* '''openfire-service /install''' -- 安装服务.&lt;br /&gt;
* '''openfire-service /uninstall''' -- 卸载服务.&lt;br /&gt;
* '''openfire-service /start''' -- 启动服务.&lt;br /&gt;
* '''openfire-service /stop''' -- 停止服务. &lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/windows_service.png&lt;br /&gt;
&lt;br /&gt;
你也可以在Windows控制面板使用服务工具来启动和停止服务.&lt;br /&gt;
&lt;br /&gt;
注意: 那个图形化的启动器目前和Windows服务还不兼容. 如果你安装了服务, 你应该使用上述的服务控制台来控制服务而不是这个图形启动器.&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
-Xms512m&lt;br /&gt;
-Xmx1024m&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
要新建参数给普通的启动器, 新建一个文件，名为 openfired.vmoptions (因为 openfire.exe 启动器会调用 openfired.exe 可执行文件来实际地启动服务器).&lt;br /&gt;
&lt;br /&gt;
==在Linux/Unix下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你正在一个 Red Hat 或类 Red Hat 的系统上运行 (CentOS, Fedora, 等等), 我们建议使用RPM，因为它包含一些标准的类Red Hat环境的自定义处理. 假设你使用了RPM, 你可以使用 '''/etc/init.d/openfire''' 脚本启动和停止Openfire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/init.d/openfire&lt;br /&gt;
Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload}&lt;br /&gt;
# /etc/init.d/openfire start&lt;br /&gt;
Starting openfire:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你正在一个不同的Linux/Unix变种下运行, 并且/或你使用了tar.gz '安装包', 你可以使用你的Openfire安装目录下的 bin/openfire 脚本启动和停止Openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ./openfire&lt;br /&gt;
Usage: ./openfire {start|stop}&lt;br /&gt;
# ./openfire start&lt;br /&gt;
Starting openfire&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你想把Openfire安装成一个服务, 在 bin/extra 目录提供了两个脚本:&lt;br /&gt;
&lt;br /&gt;
* redhat-postinstall.sh -- 自动把Openfire安装为Red Hat的服务. 它会新建一个&amp;quot;jive&amp;quot;用户，然后拷贝 openfired 脚本到你的 init.d 目录. 这个脚本必须以root身份来运行. 更多信息请看脚本里的注释.&lt;br /&gt;
* openfired -- 把Openfire当成服务运行的脚本. 你必须手工配置这个脚本. 更多信息请看脚本里的注释.&lt;br /&gt;
&lt;br /&gt;
'''如果你通过RPM安装，不推荐你使用这些脚本. RPM已经把这些脚本照顾得很好了.'''&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 如果你是通过RPM安装的, 你可以编辑 /etc/sysconfig/openfire 文件并找到 OPENFIRE_OPTS 选项来定制它. 如果你通过.tar.gz安装的, 你要调整你的启动脚本来满足你的需要.&lt;br /&gt;
&lt;br /&gt;
==插件==&lt;br /&gt;
&lt;br /&gt;
插件给Openfire增加了额外的特性和协议支持. 在安装完你的Openfire之后, 你可能想下载并安装插件以增进你的服务器. 插件可从 igniterealtime.org 的 plugins 页面下载或直接从内部的管理控制台直接下载.&lt;br /&gt;
&lt;br /&gt;
===安装插件===&lt;br /&gt;
&lt;br /&gt;
如果你从Openfire内部的管理控制台下载了一个插件, 它将被自动安装. 如果你手工下载这个插件(打包成一个.jar文件), 你可以通过把插件文件拷贝到Openfire安装目录下的 plugins/ 目录来布署它. 一个插件监控器将自动解包这个插件到一个目录并安装这个插件到Openfire. 你也可以在管理控制台使用&amp;quot;上传插件&amp;quot;功能(在 插件 标签页) 来从本地文件系统装入一个插件到服务器.&lt;br /&gt;
&lt;br /&gt;
===管理插件===&lt;br /&gt;
&lt;br /&gt;
插件可通过内部的Openfire管理控制台来管理. 你也可以在任何时候通过删除插件的JAR文件来手工删除一个插件(当你这么干了，Openfire将从内存自动移除这个插件并删除它的目录).&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97</id>
		<title>Openfire:安装指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97"/>
				<updated>2011-05-30T09:18:20Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 安装概述 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html '''&lt;br /&gt;
&lt;br /&gt;
'''安装指南'''&lt;br /&gt;
&lt;br /&gt;
Openfire是一个强大的即时消息（IM）和聊天服务器，它实现了XMPP协议。这份文件将引导您通过安装Openfire。对于更多的功能和信息的完整列表，请访问Openfire网站：http://www.igniterealtime.org/projects/openfire/&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
运行Openfire 安装包. 应用缺省将被安装于目录 c:\Program Files\Openfire .&lt;br /&gt;
&lt;br /&gt;
===Linux/Unix===&lt;br /&gt;
&lt;br /&gt;
可选择RPM包或tar.gz包. 如果使用RPM包, 用你的包管理器运行把它Openfire安装到目录 /opt/openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpm -ivh openfire_3_0_0.rpm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果使用.tar.gz包, 解压到目录 /opt 或 /usr/bin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xzvf openfire_3_0_0.tar.gz&lt;br /&gt;
mv openfire /opt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''注意''': .tar.gz包不一定包含Java虚拟机(JRE). 所以, 你必须之前就有 JDK 或 JRE 1.5.0 (Java 5) 或之后安装到你的系统里. 你可以在命令行键入 &amp;quot;java -version&amp;quot; 来检查你的java版本，然后 (如果必要) 访问 http://java.sun.com 更新你的Java安装.&lt;br /&gt;
&lt;br /&gt;
==安装概述==&lt;br /&gt;
&lt;br /&gt;
为了完成Openfire的安装, 你需要执行以下步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Openfire:安装指南#安装数据库|数据库]] - 如果你选择使用一个外部数据库, 你必须准备为Openfire准备好你的数据库.&lt;br /&gt;
# [[Openfire:安装指南#安装服务器|安装]] - 使用内置的基于web的安装工具来安装和验证服务器的配置.&lt;br /&gt;
# [[Openfire:安装指南#管理控制台|管理控制台]] - 使用基于web的管理工具来管理服务器.&lt;br /&gt;
&lt;br /&gt;
本文也包括以下信息:&lt;br /&gt;
&lt;br /&gt;
* [[Openfire:安装指南#在Windows下运行Openfire|在Windows下运行]]&lt;br /&gt;
* [[Openfire:安装指南#在Unix/Linux下运行Openfire|在Unix/Linux下运行]]&lt;br /&gt;
* [[Openfire:安装指南#插件|安装和使用插件]]&lt;br /&gt;
&lt;br /&gt;
==分发版里的文件==&lt;br /&gt;
&lt;br /&gt;
你的分发版里的文件应该像下面这样 (为了简短一点，一些子目录被忽略了):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openfire/&lt;br /&gt;
 |- readme.html&lt;br /&gt;
 |- license.html&lt;br /&gt;
 |- conf/&lt;br /&gt;
 |- bin/&lt;br /&gt;
 |- jre/&lt;br /&gt;
 |- lib/&lt;br /&gt;
 |- plugins/&lt;br /&gt;
     |- admin/&lt;br /&gt;
 |- resources/&lt;br /&gt;
     |-database/&lt;br /&gt;
     |-security/&lt;br /&gt;
 |- documentation/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''conf''' 目录Openfire用来存放配置文件.&lt;br /&gt;
* '''bin''' 目录包含了服务器的可执行文件. 根据你安装的不同分发版, 可用的执行文件也不同.&lt;br /&gt;
* '''jre''' 目录包含了一个 Java 5 虚拟机，打包在Windows和RPM版本Openfire里面的.&lt;br /&gt;
* '''lib''' 目录包含了运行Openfire所需要的库.&lt;br /&gt;
* '''plugins''' 目录包含了服务器插件. 缺省地, Openfire带了一个基于web的管理控制台插件.&lt;br /&gt;
* '''resources/database''' 目录包含 SQL 架构文件，用来新建Openfire数据库, 以及已有安装的更新脚本.&lt;br /&gt;
* '''resources/security''' 目录是Openfire维护keystores的地方，用来支持SSL连接安全性.&lt;br /&gt;
* '''documentation''' 目录包含了服务器文档.&lt;br /&gt;
&lt;br /&gt;
==安装数据库==&lt;br /&gt;
&lt;br /&gt;
Openfire能把它的数据存储在一个嵌入式的数据库里，你也能选择使用一个外部数据库,例如MySQL或Oracle. 如果你喜欢使用外部数据库, 你必须在开始安装之前准备好它. 更多信息见[http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database.html 数据库安装].&lt;br /&gt;
&lt;br /&gt;
==安装服务器==&lt;br /&gt;
&lt;br /&gt;
Openfire內建了一个基于web的, &amp;quot;向导&amp;quot;驱动的安装和配置工具. 简单地启动Openfire(分平台的指引如下) 并使用浏览器连接到管理控制台. 基于web的管理控制台的缺省端口是9090. 如果你和Openfire在同一台机器, 以下URL通常会起作用: http://127.0.0.1:9090.&lt;br /&gt;
&lt;br /&gt;
==管理控制台==&lt;br /&gt;
&lt;br /&gt;
在完成上述步骤之后, Openfire将被配置，你可以用基于web的管理控制台管理服务器. URL应该和你用来安装服务器用的那个一样，除非你在安装期间修改了那个端口.&lt;br /&gt;
&lt;br /&gt;
==在Windows下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你使用了Openfire安装包, 在你的开始菜单里会有一个快捷方式来启动图形化启动器. 否则, 在你的 Openfire 安装位置的 bin/ 目录运行 openfire.exe . 在启动界面上有一个按钮，允许你自动打开你的web浏览器连接正确的URL来完成服务器的安装&lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/launcher.png&lt;br /&gt;
&lt;br /&gt;
===Windows服务===&lt;br /&gt;
&lt;br /&gt;
如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作为一个标准的Windows来运行. 如果你使用Windows安装包, 一个 openfire-service.exe 文件将会出现在安装目录下的 bin 目录. 你可以使用这个可执行文件来安装和控制Openfire服务.&lt;br /&gt;
&lt;br /&gt;
从控制台窗口, 你可以运行以下命令:&lt;br /&gt;
&lt;br /&gt;
* '''openfire-service /install''' -- 安装服务.&lt;br /&gt;
* '''openfire-service /uninstall''' -- 卸载服务.&lt;br /&gt;
* '''openfire-service /start''' -- 启动服务.&lt;br /&gt;
* '''openfire-service /stop''' -- 停止服务. &lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/windows_service.png&lt;br /&gt;
&lt;br /&gt;
你也可以在Windows控制面板使用服务工具来启动和停止服务.&lt;br /&gt;
&lt;br /&gt;
注意: 那个图形化的启动器目前和Windows服务还不兼容. 如果你安装了服务, 你应该使用上述的服务控制台来控制服务而不是这个图形启动器.&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
-Xms512m&lt;br /&gt;
-Xmx1024m&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
要新建参数给普通的启动器, 新建一个文件，名为 openfired.vmoptions (因为 openfire.exe 启动器会调用 openfired.exe 可执行文件来实际地启动服务器).&lt;br /&gt;
&lt;br /&gt;
==在Linux/Unix下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你正在一个 Red Hat 或类 Red Hat 的系统上运行 (CentOS, Fedora, 等等), 我们建议使用RPM，因为它包含一些标准的类Red Hat环境的自定义处理. 假设你使用了RPM, 你可以使用 '''/etc/init.d/openfire''' 脚本启动和停止Openfire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/init.d/openfire&lt;br /&gt;
Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload}&lt;br /&gt;
# /etc/init.d/openfire start&lt;br /&gt;
Starting openfire:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你正在一个不同的Linux/Unix变种下运行, 并且/或你使用了tar.gz '安装包', 你可以使用你的Openfire安装目录下的 bin/openfire 脚本启动和停止Openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ./openfire&lt;br /&gt;
Usage: ./openfire {start|stop}&lt;br /&gt;
# ./openfire start&lt;br /&gt;
Starting openfire&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你想把Openfire安装成一个服务, 在 bin/extra 目录提供了两个脚本:&lt;br /&gt;
&lt;br /&gt;
* redhat-postinstall.sh -- 自动把Openfire安装为Red Hat的服务. 它会新建一个&amp;quot;jive&amp;quot;用户，然后拷贝 openfired 脚本到你的 init.d 目录. 这个脚本必须以root身份来运行. 更多信息请看脚本里的注释.&lt;br /&gt;
* openfired -- 把Openfire当成服务运行的脚本. 你必须手工配置这个脚本. 更多信息请看脚本里的注释.&lt;br /&gt;
&lt;br /&gt;
'''如果你通过RPM安装，不推荐你使用这些脚本. RPM已经把这些脚本照顾得很好了.'''&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 如果你是通过RPM安装的, 你可以编辑 /etc/sysconfig/openfire 文件并找到 OPENFIRE_OPTS 选项来定制它. 如果你通过.tar.gz安装的, 你要调整你的启动脚本来满足你的需要.&lt;br /&gt;
&lt;br /&gt;
==插件==&lt;br /&gt;
&lt;br /&gt;
插件给Openfire增加了额外的特性和协议支持. 在安装完你的Openfire之后, 你可能想下载并安装插件以增进你的服务器. 插件可从 igniterealtime.org 的 plugins 页面下载或直接从内部的管理控制台直接下载.&lt;br /&gt;
&lt;br /&gt;
===安装插件===&lt;br /&gt;
&lt;br /&gt;
如果你从Openfire内部的管理控制台下载了一个插件, 它将被自动安装. 如果你手工下载这个插件(打包成一个.jar文件), 你可以通过把插件文件拷贝到Openfire安装目录下的 plugins/ 目录来布署它. 一个插件监控器将自动解包这个插件到一个目录并安装这个插件到Openfire. 你也可以在管理控制台使用&amp;quot;上传插件&amp;quot;功能(在 插件 标签页) 来从本地文件系统装入一个插件到服务器.&lt;br /&gt;
&lt;br /&gt;
===管理插件===&lt;br /&gt;
&lt;br /&gt;
插件可通过内部的Openfire管理控制台来管理. 你也可以在任何时候通过删除插件的JAR文件来手工删除一个插件(当你这么干了，Openfire将从内存自动移除这个插件并删除它的目录).&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:55:40Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Jabberd 2体系结构(草稿) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;br /&gt;
&lt;br /&gt;
''authreg'' 段落解决客户端验证和注册的问题:&lt;br /&gt;
&lt;br /&gt;
* 验证包&lt;br /&gt;
* 公开注册&lt;br /&gt;
* 密码修改&lt;br /&gt;
* 验证机制&lt;br /&gt;
* 验证包配置&lt;br /&gt;
&lt;br /&gt;
这些子段落描述如下.&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
''module'' 子段落指定所使用的验证数据包. Jabberd根据你编译时候参数的选择来设置这个 ''module'' , 所以你应该不需要编辑它，除非你要在安装Jabberd之后修改验证数据包.&lt;br /&gt;
&lt;br /&gt;
====公开注册====&lt;br /&gt;
&lt;br /&gt;
''register'' 子段落下的 ''enable'' 控制是否允许新用户的公开注册. 公开注册缺省是允许的. 注释掉这个 ''enable'' 标签可以禁止公开注册.&lt;br /&gt;
&lt;br /&gt;
====密码修改====&lt;br /&gt;
&lt;br /&gt;
''register'' 下的 ''password'' 段落规定是否允许用户修改他们自己的密码. 密码修改缺省是禁止的. 如 ''c2s.xml'' 所提到的, 如果禁用了公开注册，那么允许修改密码可能是有用的.&lt;br /&gt;
&lt;br /&gt;
====验证机制====&lt;br /&gt;
&lt;br /&gt;
''mechanisms'' 子段落指定提供哪种验证加密方法给客户端. 如 ''c2s.xml'' 所述, 你应该注释掉任何不想提供的机制.&lt;br /&gt;
&lt;br /&gt;
====验证包配置====&lt;br /&gt;
&lt;br /&gt;
''authreg'' 的最后一个子段落控制你的验证数据包的连接. 缺省的设置对大部分人来说够用了，除非你的验证数据包运行在一个独立的服务器上.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section12/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Jabberd 2体系结构(草稿)==&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 本章还在创作中'''&lt;br /&gt;
&lt;br /&gt;
:注意本章是很大程度上还在创作中. 所以, 以下信息应该被视为草稿, Jabberd 2体系结构的并且不是最终描述. 基本上, 我加入这章是因为我正在学习Jabberd 2.&lt;br /&gt;
&lt;br /&gt;
|| 下一步打算: 为体系结构概述添加体系结构特性列表 -或- 只是新特性列表 ||&lt;br /&gt;
&lt;br /&gt;
===Jabber网络体系结构===&lt;br /&gt;
===Jabberd 2组件体系结构===&lt;br /&gt;
===Jabberd 2模块分解===&lt;br /&gt;
===Jabberd 2数据处理===&lt;br /&gt;
===Jabberd 2数据结构(MySQL)===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:48:52Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 验证包配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;br /&gt;
&lt;br /&gt;
''authreg'' 段落解决客户端验证和注册的问题:&lt;br /&gt;
&lt;br /&gt;
* 验证包&lt;br /&gt;
* 公开注册&lt;br /&gt;
* 密码修改&lt;br /&gt;
* 验证机制&lt;br /&gt;
* 验证包配置&lt;br /&gt;
&lt;br /&gt;
这些子段落描述如下.&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
''module'' 子段落指定所使用的验证数据包. Jabberd根据你编译时候参数的选择来设置这个 ''module'' , 所以你应该不需要编辑它，除非你要在安装Jabberd之后修改验证数据包.&lt;br /&gt;
&lt;br /&gt;
====公开注册====&lt;br /&gt;
&lt;br /&gt;
''register'' 子段落下的 ''enable'' 控制是否允许新用户的公开注册. 公开注册缺省是允许的. 注释掉这个 ''enable'' 标签可以禁止公开注册.&lt;br /&gt;
&lt;br /&gt;
====密码修改====&lt;br /&gt;
&lt;br /&gt;
''register'' 下的 ''password'' 段落规定是否允许用户修改他们自己的密码. 密码修改缺省是禁止的. 如 ''c2s.xml'' 所提到的, 如果禁用了公开注册，那么允许修改密码可能是有用的.&lt;br /&gt;
&lt;br /&gt;
====验证机制====&lt;br /&gt;
&lt;br /&gt;
''mechanisms'' 子段落指定提供哪种验证加密方法给客户端. 如 ''c2s.xml'' 所述, 你应该注释掉任何不想提供的机制.&lt;br /&gt;
&lt;br /&gt;
====验证包配置====&lt;br /&gt;
&lt;br /&gt;
''authreg'' 的最后一个子段落控制你的验证数据包的连接. 缺省的设置对大部分人来说够用了，除非你的验证数据包运行在一个独立的服务器上.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section12/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Jabberd 2体系结构(草稿)==&lt;br /&gt;
===Jabber网络体系结构===&lt;br /&gt;
===Jabberd 2组件体系结构===&lt;br /&gt;
===Jabberd 2模块分解===&lt;br /&gt;
===Jabberd 2数据处理===&lt;br /&gt;
===Jabberd 2数据结构(MySQL)===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 客户端验证和注册 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;br /&gt;
&lt;br /&gt;
''authreg'' 段落解决客户端验证和注册的问题:&lt;br /&gt;
&lt;br /&gt;
* 验证包&lt;br /&gt;
* 公开注册&lt;br /&gt;
* 密码修改&lt;br /&gt;
* 验证机制&lt;br /&gt;
* 验证包配置&lt;br /&gt;
&lt;br /&gt;
这些子段落描述如下.&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
''module'' 子段落指定所使用的验证数据包. Jabberd根据你编译时候参数的选择来设置这个 ''module'' , 所以你应该不需要编辑它，除非你要在安装Jabberd之后修改验证数据包.&lt;br /&gt;
&lt;br /&gt;
====公开注册====&lt;br /&gt;
&lt;br /&gt;
''register'' 子段落下的 ''enable'' 控制是否允许新用户的公开注册. 公开注册缺省是允许的. 注释掉这个 ''enable'' 标签可以禁止公开注册.&lt;br /&gt;
&lt;br /&gt;
====密码修改====&lt;br /&gt;
&lt;br /&gt;
''register'' 下的 ''password'' 段落规定是否允许用户修改他们自己的密码. 密码修改缺省是禁止的. 如 ''c2s.xml'' 所提到的, 如果禁用了公开注册，那么允许修改密码可能是有用的.&lt;br /&gt;
&lt;br /&gt;
====验证机制====&lt;br /&gt;
&lt;br /&gt;
''mechanisms'' 子段落指定提供哪种验证加密方法给客户端. 如 ''c2s.xml'' 所述, 你应该注释掉任何不想提供的机制.&lt;br /&gt;
&lt;br /&gt;
====验证包配置====&lt;br /&gt;
&lt;br /&gt;
''authreg'' 的最后一个子段落控制你的验证数据包的连接. 缺省的设置对大部分人来说够用了，除非你的验证数据包运行在一个独立的服务器上.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section12/html2pdf 以PDF格式查看]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:28:04Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 输入输出控制 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''c2s.xml'' 文件所说, ''c2s'' 本身可能使用最多5条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''c2s.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''c2s'' . 被禁止访问 ''c2s'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
====客户端连接检查====&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber客户端的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:19:59Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 网络配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 段落指定 ''c2s'' 的网络配置. 对大部分安装来说， ''id'' 应该和 ''sm.xml'' 中的指定的ID相同. 在多个jabber服务器依赖于同于一个验证数据库的时候要使用 ''realm'' 属性. 可能发生在很大的公司，需要用到多个Jabebr服务器通过LDAP验证. 缺省的IP地址和端口对大部分安装来说是够用的( 0.0.0.0 的设置允许c2s监听所有可用IP地址).&lt;br /&gt;
&lt;br /&gt;
''local'' 段落下的 ''pemfile'' 子段落指定和客户端通讯所用的证书和密钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在Jabberd和客户端之间禁用 SSL 通讯.&lt;br /&gt;
 注意这个密钥对不需要和用于Jabberd组件内部通讯的密钥相同.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:08:27Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 日志 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''c2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 和Router通讯 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''c2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''c2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''c2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''c2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''c2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* C2s.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T08:04:29Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* S2S连接检查 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==C2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''c2s.xml'' 文件配置Jabberd的 客户端-服务器 组件. ''c2s'' 组件负责和Jabberd客户端之间的通讯, ''c2s.xml'' 主要和客户端通讯相关:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#输入输出控制|输入输出控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#客户端验证和注册|客户端验证和注册]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''c2s.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===PID文件&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
===客户端验证和注册===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:49:27Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* S2S连接检查 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;br /&gt;
&lt;br /&gt;
''check'' 段落负责检查和其他Jabber服务器的连接. 缺省的, 这些检查是禁用的 (''interval'' 设为 ''0''). 为了激活检查功能, 设置一个 ''interval'' ，单位是秒, 然后设定队列过期的时间间隔, 非法路由过期 和/或 保持连接.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 什么情况下连接检查最有用? ||&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section11/html2pdf 以PDF格式查看]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:45:07Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 网络配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落指定网络配置让 ''s2s'' 能安全地使用回拨密钥. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的( 0.0.0.0 的设置允许s2s监听所有可用IP地址). ''secret'' 设置指定 ''s2s'' 为其他Jabberd服务器生成回拨密钥的口令. 生产环境中这个 ''sercret'' 的缺省设置应该修改.&lt;br /&gt;
&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:35:49Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 日志 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''s2s'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===网络配置===&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:35:05Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 和Router通讯 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''s2s'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''s2s'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''s2s'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''s2s'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''s2s'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:32:48Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* PID文件 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* S2s.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
&lt;br /&gt;
''s2s.xml'' 文件配置Jabberd 2的 服务器-服务器 组件. ''s2s.xml'' 文件为本组件和 ''router'' 组件通讯提供网络设置:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#网络配置|网络配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#S2S连接检查|S2S连接检查]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''s2s.xml'' 文件配置的概述.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:06:38Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 日志 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==S2s.xml配置==&lt;br /&gt;
===PID文件===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===网络配置===&lt;br /&gt;
===S2S连接检查===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:05:02Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 日志 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''resolver'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section10/html2pdf 以PDF格式查看]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T07:03:44Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 和Router通讯 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件的通讯. 对大部分安装来说缺省的 ''ip'' 和 ''port'' 应该够了, 不过要注意如果 ''resolver'' 是运行在单独的服务器上时, 这里要指定一个外部的IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''resolver'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''resolver'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''resolver'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''resolver'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T06:54:14Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* PID文件 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件这个段落可以注释掉.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-14T04:13:11Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Resolver.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
&lt;br /&gt;
''resolver.xml'' 文件配置 ''router'' 组件为 ''s2s'' (服务器到服务器) 组件处理主机名解析. ''resolver.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#PID文件|PID文件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
&lt;br /&gt;
''resolver'' 的配置主要是 ''resolver'' 和 ''router'' 组件通讯.&lt;br /&gt;
&lt;br /&gt;
===PID文件===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:36:16Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 用户选项 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Resolver.xml配置==&lt;br /&gt;
===PID文件===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:34:45Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Sm.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态浏览设置|外部组件的静态浏览设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;br /&gt;
&lt;br /&gt;
''user'' 段落指定了模板，这个模板应该在创建用户时被加入到一个用户的数据存储中去, 这个段落也规定用户登录时如果还不存在，系统是否应该立刻创建它. 这个选项运习惯管理员添加用户到验证数据库(''authreg'') 然后那些用户除此登录时被自动创建.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section09/html2pdf 以PDF格式查看]&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:30:20Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 外部组件的静态查询设置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态浏览设置===&lt;br /&gt;
&lt;br /&gt;
''discovery'' 段落包括用于即时消息(''identity'' 子段落)的标准服务信息和用于外部组件(''items'' 子段落)的静态浏览的设置. 如果你的服务器正在运高兴外部组件, 例如 JUD, MU Conferencing, MSN-T 或 Aimtrans, 如果该组件不支持 ''disco'' (浏览),那么你应该完成一个 ''item'' 子段落. 这个段落下面有一些例子教你如何为你的外部组件添加一个 ''item'' 来设置静态浏览.&lt;br /&gt;
&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:23:47Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 会话调用的模块 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
&lt;br /&gt;
''modules'' 段落控制特定事件调用的模块链. 事件定义基于接收或递送某种类型的包. 这些模块链应该只让有经验的Jabberd管理员来编辑. 特别要注意用户创建(''user-create'')和用户删除(''user-delete'')时所调用的链.&lt;br /&gt;
&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:19:11Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 管理功能的访问控制 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
&lt;br /&gt;
''acl'' 段落控制哪个用户拥有管理权限. 这些功能包括广播,消息和搜索. 注意本段落指定的管理员用户不会被自动创建到验证(''authreg'')数据库. 所以, 你必须单独注册一个用户. [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|6.5]] 描述了如何使用管理帐户发送消息给所有用户.&lt;br /&gt;
&lt;br /&gt;
管理功能目前Jabber客户端只有最小支持; 不过, Windows版 [http://jajc.ksn.ru/ JAJC]] 客户端支持浏览在线用户和向在线用户发送消息的管理功能.&lt;br /&gt;
&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:10:48Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 数据库连接和配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
&lt;br /&gt;
''session manager'' 处理数据库连接的设置请参考本指南的 ''应用数据包'' (区别于 ''验证数据包'' ). 你只需要编辑你选择的 ''应用数据包'' (MySQL, PostgreSQL 或 Berkeley DB)相对应的子段落. 对于和 ''session manager''  运行在同一台服务器的数据库包，你应该只需要编辑连接数据库的密码(这对Berkeley DB无效). 如果数据库运行在独立机器那么要修改 ''host'' . 注意不应该在生产环境中使用缺省密码(''secret'').&lt;br /&gt;
&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T17:00:53Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 日志 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省写到 ''syslog'' . 如果你想让 ''session manager'' 写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志的位置.&lt;br /&gt;
&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T16:58:58Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* 和Router通讯 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
&lt;br /&gt;
''router'' 段落控制和 ''router'' 组件之间的通讯. 缺省的 ''ip'' 和 ''port'' 对大部分安装应该够了, 不过要主义如果 ''session manager'' 运行在一个独立的服务器上, 这里应该指定一个外部IP地址.&lt;br /&gt;
&lt;br /&gt;
''user'' 和 ''pass'' 子段落指定用于连接 ''router'' 的用户名. 它们必须和 [[Jabberd2:安装和管理指南#Router-users.xml配置|8]] 中所描述的 ''router-users.xml'' 匹配 . 对于生产系统基本的安全要求应该是修改缺省密码.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 段落指定和 ''router'' 通讯用的证书和私钥. 关于在Jabberd上设置SSL的更多信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释这一段表示在 ''session manager'' 和 ''router'' 之间禁用 SSL 通讯.&lt;br /&gt;
&lt;br /&gt;
''retry'' 段落指定 ''session manager'' 如果在启动时无法建立连接或在运行时失去连接应该如何重连到 ''router'' . 缺省的设置当无法连接时不会让 ''session manager'' 无限地重连. 如果 ''router'' 挂掉或被停止，那么这些缺省设置基本上会导致 ''session manager'' 也挂掉.&lt;br /&gt;
&lt;br /&gt;
===日志===&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T16:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Jabberd身份 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 最前面的两个段落指定网络ID和写PID文件的位置. ''id'' 段落非常重要，因为这个ID加在用户名后面就构成了一个 JID (Jabber身份). 对于大部分安装来说, ''id'' 就是主机名 — 类似 ''somedomain.com'' . 如果服务器要和其他Jabber服务器通讯个，那么这个ID必须可以被DN解析; 当然, 对于封闭的或内部的Jabebrd系统，它不需要可解析. IP地址也可被用作 'id'; 然而, 因为IP地址不可以通过DNS解析, 一个使用IP地址作为ID的系统不能够和别的Jabber服务器通讯.&lt;br /&gt;
&lt;br /&gt;
''pid'' 段落指定PID文件的位置. 如果不需要PID文件，可以注释掉这一行.&lt;br /&gt;
&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T16:31:03Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Sm.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
&lt;br /&gt;
''sm.xml'' 文件配置Jabberd 2的 ''session manager'' 组件. ''session manager'' 在router和外部可用的组件 (s2s 和 c2s) 之间扮演一个层的角色. ''sm.xml'' 文件配置以下功能:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#Jabberd身份|Jabberd身份]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#和Router通讯|和Router通讯]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#日志|日志]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#数据库连接和配置|数据库连接和配置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#管理功能的访问控制|管理功能的访问控制]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#会话调用的模块|会话调用的模块]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#外部组件的静态查询设置|外部组件的静态查询设置]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#用户选项|用户选项]]&lt;br /&gt;
&lt;br /&gt;
以下是 ''sm.xml'' 文件的概览.&lt;br /&gt;
&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97</id>
		<title>Jabberd2:安装和管理指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Jabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E7%AE%A1%E7%90%86%E6%8C%87%E5%8D%97"/>
				<updated>2011-04-13T09:20:30Z</updated>
		
		<summary type="html">&lt;p&gt;How: /* Router-users.xml配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:翻译中]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.jabberdoc.org/jabberd_guide '''&lt;br /&gt;
&lt;br /&gt;
'''Jabberd2安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
本文包括 [http://jabberd.jabberstudio.org/2/ Jabberd 2 服务器] (Jabberd) 的安装和管理指南 , 流行的基于[http://www.jabber.org/protocol/ Jabber协议]的开源即时消息系统的最新版本. Jabber的目标是为客户端和客户端之间同步和异步的通讯提供一个XML协议, 尽管Jabber主要用于即时消息 (IM).&lt;br /&gt;
&lt;br /&gt;
Jabberd 服务器是Jabberd协议原始的开源服务器实现, 并且留下了大部分流行的软件，无论是布署在公司或作为一个公开的 IM 服务. Jeremie Miller在1998年开始了Jabber项目，提供给所有的IM服务一个自由和开放的选择. Jabberd服务器继续成为Jabber项目的核心, 并且Jabberd 2相对于于使用更广泛的Jabberd 1.4服务器来说是成功者. Jabberd 2 是基于一个新体系结构的完整的新代码, 额外的功能，并更好地遵守了Jabber协议.&lt;br /&gt;
&lt;br /&gt;
一个常见的消息协议的建立, 现在大家知道的[http://www.ietf.org/html.charters/xmpp-charter.html XMPP] (可扩展的消息和出席信息协议), 允许在Jabberd服务器之外新建更多的Jabber服务器实现. 这许多的开源项目中, 包含[http://www.jabberstudio.org/projects/wpjabber/project/view.php WP Jabber] 和 [http://www.jabberstudio.org/projects/ejabberd/project/view.php ejabberd], 以及许多软件来自商业机构如 i3connect, Jabcast, Tipic 和 Jabber, Inc.&lt;br /&gt;
&lt;br /&gt;
===目的和范围===&lt;br /&gt;
&lt;br /&gt;
本文的作者打算提供一个完整的关于 jabberd 2 安装, 管理和开发的指南:&lt;br /&gt;
&lt;br /&gt;
* 系统准备&lt;br /&gt;
* 服务器准备&lt;br /&gt;
* 服务器配置&lt;br /&gt;
* 体系结构概述&lt;br /&gt;
&lt;br /&gt;
目标受众是那些希望在Unix或其某个变种安装和/或维护一个jabberd 2服务器的人. 因此, 本文仅覆盖了Unix操作系统上的Jabberd安装.&lt;br /&gt;
&lt;br /&gt;
===需要的背景知识===&lt;br /&gt;
&lt;br /&gt;
作者做了很多努力来制作这个手把手的指南; 然而, 还是假定读者对Unix 或 Linux 操作系统比较熟悉:&lt;br /&gt;
&lt;br /&gt;
* 能使用Linux命令行控制台&lt;br /&gt;
* 熟悉文件系统，你的服务器将装在那里&lt;br /&gt;
* 熟悉一个文本编辑器, 如 vi, Nano 或 NEdit&lt;br /&gt;
* 基本的编辑 XML 文件的能力&lt;br /&gt;
&lt;br /&gt;
假定读者基本熟练使用一个Jabber客户端. 另外, 假定读者熟悉硬件和软件, 例如防火墙, 路由器或调制解调器, 如果使用了这类硬件，jabber服务器将用来连接到互联网. 这些次要程序和设备的配置超出了本指南的范围.&lt;br /&gt;
&lt;br /&gt;
===如何使用本文档===&lt;br /&gt;
&lt;br /&gt;
本指南根据用户的使用来组织章节:&lt;br /&gt;
&lt;br /&gt;
* 安装和配置 Jabberd 2 ([[Jabberd2:安装和管理指南#准备安装Jabberd2|2到4章]])&lt;br /&gt;
* 一般的配置和管理任务 ([[Jabberd2:安装和管理指南#一般的配置任务|5到6章]])&lt;br /&gt;
* Jabberd 2配置文件概要 ([[Jabberd2:安装和管理指南#Router.xml配置|7到12章]])&lt;br /&gt;
* Jabber 2体系结构 ([[Jabberd2:安装和管理指南#Jabberd2体系结构(草稿)|13章]])&lt;br /&gt;
* Jabberd 快速指南 ([[Jabberd2:安装和管理指南#附录|附录A]])&lt;br /&gt;
* Jabberd 2 常见问题([[Jabberd2:安装和管理指南#Jabberd 2 FAQ|FAQ]])&lt;br /&gt;
&lt;br /&gt;
[[Jabberd2:安装和管理指南#Jabberd2快速指南|快速指南]]是为有经验的用户尽快运行而设计的. 详细的 Jabberd 2 安装指导开始于第二章，[[Jabberd2:安装和管理指南#准备安装Jabberd2|准备安装Jabberd2]]. 第5和第6章分别列出了常见的[[Jabberd2:安装和管理指南#常见配置任务|配置]]和[[Jabberd2:安装和管理指南#常见管理任务|管理]]任务, 剩下的章节提供了详细的配置信息.&lt;br /&gt;
&lt;br /&gt;
===本文使用的约定===&lt;br /&gt;
&lt;br /&gt;
本文主要是作为一个安装指南提供的, 因此, 使用了特定的约定来使安装对用户来说更容易. 以下出现的约定贯穿本指南的安装章节:&lt;br /&gt;
&lt;br /&gt;
'''表 1.4. 本指南使用的文档约定'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!约定 !! 名称 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|P || 参数 || 一个配置文件中关于你的特定安装的信息, 等等.&lt;br /&gt;
|-&lt;br /&gt;
|C || 检查点 || 一个点，停止并检查你的安装&lt;br /&gt;
|-&lt;br /&gt;
|N || 注意 || 强调信息&lt;br /&gt;
|-&lt;br /&gt;
|I || 重要 || 重要的强调或警告&lt;br /&gt;
|-&lt;br /&gt;
|F || 必需的文件 || 完成这一步或下列步骤所需要的软件或特定文件&lt;br /&gt;
|-&lt;br /&gt;
|O || 可选步骤 || 这一步在大部分基本安装中不是必需的步骤&lt;br /&gt;
|-&lt;br /&gt;
|E || 外部系统 || 这一步可能需要在外部系统配置，如路由器&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这些里面最有用的约定是参数&amp;quot;Parameters.&amp;quot; 第2章开始于一个关于你的安装的信息(参数)的列表，在你的安装步骤中将需要用到它们. 你可以在开始安装Jabberd之前收集所有这些信息, 然后你可以在每一步显示了P的地方参考.&lt;br /&gt;
&lt;br /&gt;
这个安装指南用编号来组织这些步骤，下级步骤. 鼓励用户把本指南当成一个检查列表来使用. 当一个步骤的所有下级步骤完成, 接着上级步骤本身也完成了. 注意一个 &amp;quot;可选步骤&amp;quot;的所有子 (下级步骤) 也是可选的. 注意 &amp;quot;可选步骤&amp;quot; 设计用来满足关于在哪个条件和/或下可选步骤应被执行的需求.&lt;br /&gt;
&lt;br /&gt;
标为&amp;quot;外部系统&amp;quot;的步骤提供信息给用户，表示安装可能需要执行于一个jabberd之外的系统. 这些系统包括路由器, 防火墙, DNS服务器, 等等. &amp;quot;外部系统&amp;quot; 提示主要是信息提示而不是详尽的. 剩下的约定是不言自明的.&lt;br /&gt;
&lt;br /&gt;
注意本指南列出的每个命令引用的一个命令都是进入了一个命令行提示或命令行提示shell, 例如 X-term 或 E-term. 也要注意在本文里, 术语 &amp;quot;Jabberd&amp;quot; 指的是 Jabberd 2 服务器, 除非特别声明. 术语 &amp;quot;Jabber&amp;quot; 指基于Jabber的系统或系统们, 而 &amp;quot;XMPP&amp;quot; 指Jabber系统运行的协议.&lt;br /&gt;
&lt;br /&gt;
本文使用[http://dev.zope.org/Members/jim/StructuredTextWiki/TextFormattingRules 结构化的文本]建立. 结构化的文本使用标准文本格式化约定, 例如 underscores, 来展示格式化的文本. 已经做了很多努力来让文本和HTML格式接近. 一个例外是，在文本版本中使用的 bang 字符 (&amp;quot;!&amp;quot;) ，在HTML版本中是用来避免不想要的格式的. &amp;quot;Bangs&amp;quot; 出现在文本版本的一些行的开始, 而这些可能被忽略. 它们不显示在 HTML 版本中.&lt;br /&gt;
&lt;br /&gt;
===更多阅读===&lt;br /&gt;
&lt;br /&gt;
访问[http://www.jabber.org/ Jabber软件基金会] 获得关于jabberd 2, jabber客户端, 和Jabber协议的最新新闻. [http://www.jabber.org/about/generalfaq.html Jabber Faq] 回答关于Jabber的基本问题. 鼓励读者访问关于jabber管理的提问 [http://news.gmane.org/gmane.network.jabber.admin Jadmin归档], 或订阅 [http://mailman.jabber.org/listinfo/jadmin/ Jadmin邮件列表]得到最新的jabberd管理信息. Jabberd 2开发信息可以在[http://jabberstudio.org/pipermail/jabberd/ Jabberd归档]找到，或订阅[http://jabberstudio.org/cgi-bin/mailman/listinfo/jabberd Jabberd邮件列表].&lt;br /&gt;
&lt;br /&gt;
也有许多好的关于Jabber的书. 注意以下的书关于jabberd 1.4的只是写于2003年:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jabber.org/admin/adminguide.html Jabberd Administration Guide for version 1.4]&lt;br /&gt;
* [http://www.oreilly.com/catalog/jabber/ Programming Jabber by D.J. Adams]&lt;br /&gt;
* [http://www.manning.com/shigeoka/ Instant Messaging for Java by Iain Shigeoka]&lt;br /&gt;
* [http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764549340.html Jabber Programming by Stephen Lee and Terence Smelser]&lt;br /&gt;
* [http://www.samspublishing.com/ Jabber Developer's Handbook from Sams Publishing]&lt;br /&gt;
&lt;br /&gt;
===法律术语===&lt;br /&gt;
&lt;br /&gt;
Jabberd安装和管理指南的版权(2003)由Will Kamishlian and Robert Norris所有。&lt;br /&gt;
&lt;br /&gt;
这项工作是根据创作共用许可署名，类似非商业性使用方式共享许可。要查看本许可协议，请访问 http://creativecommons.org/licenses/by-nc-sa/1.0/ 或发信到 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.&lt;br /&gt;
&lt;br /&gt;
===来源===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, 主要的Jabberd 2开发者, 以及Jabberd List的发起人，为本文提供了技术信息.&lt;br /&gt;
&lt;br /&gt;
==准备安装Jabberd2==&lt;br /&gt;
&lt;br /&gt;
本章让你和你的系统准备好安装Jabberd 2:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#收集必需的信息|收集必需的信息]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#新建Jabber用户和组|新建Jabber用户和组]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为PID's和Logs新建目录|为PID's和Logs新建目录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装先决条件|安装先决条件]]&lt;br /&gt;
&lt;br /&gt;
本章的表 2.1. 列出了Jabberd 2安装需要的信息. 在这个点上收集这个信息是可选的; 然而, 现在完成这个表格将使安装更容易.&lt;br /&gt;
&lt;br /&gt;
===收集必需的信息===&lt;br /&gt;
&lt;br /&gt;
下表列出的信息是安装过程中需要的. 以下是每个参数提供的信息:&lt;br /&gt;
&lt;br /&gt;
* 参数Parameter&lt;br /&gt;
* 必需的Required&lt;br /&gt;
* 章节Section&lt;br /&gt;
* 描述Description&lt;br /&gt;
* 你的信息Your Information&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parameter&amp;quot; 是信息的名称部分. 贯穿整个指南, 特定的参数指向 '''P''' 约定. &amp;quot;Required 要么是 &amp;quot;Y&amp;quot; (yes), &amp;quot;N&amp;quot; (no), 要么是 ''可选的名称''. ''可选的名称''指向这个参数需要的选项. 一些条目有建议的内容给&amp;quot;Your Information.&amp;quot; 这些条目要么显示受限的选择要么显示缺省值. 这里给出了缺省值, 它们被用于本指南的例子.&lt;br /&gt;
&lt;br /&gt;
对于最小安装, 完成所有必需的参数. 对于什么条件下需要可选的参数的更多信息, 详见参考章. &amp;quot;Description&amp;quot; 是一个简短描述. 再一次的, 详见参考章.&lt;br /&gt;
&lt;br /&gt;
'''I Important: Table Contains Passwords'''&lt;br /&gt;
&lt;br /&gt;
下表包含了密码. 如果你在下表写下了你的密码, 把本文(或页)存在一个安全的地方.&lt;br /&gt;
&lt;br /&gt;
'''表 2.1. Jabberd2安装必需的信息'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!参数 !! 必需的 !! 章节 !! 描述 !! 你的信息&lt;br /&gt;
|-&lt;br /&gt;
|Jabberd User and Group || Y || 2.2 || Linux(或其他OS)用户和组，将用于运行Jabberd || user: jabber group: jabber &lt;br /&gt;
|-&lt;br /&gt;
|PID Directory || Y || 2.3 || Jabberd存储PID文件的目录  || /usr/local/var/jabberd/pid &lt;br /&gt;
|-&lt;br /&gt;
|Log Directory || N || 2.3 || 用于Jabberd logs的目录. 如果在配置文件中不指定, 日志缺省存在syslog. || /usr/local/var/jabberd/log &lt;br /&gt;
|-&lt;br /&gt;
|Authentication Package || Y || 2.4.3 3.3, || Jabberd验证管理使用的第三方包 || MySQL, PostgreSQL, Berkeley DB, OpenLDAP or PAM &lt;br /&gt;
|-&lt;br /&gt;
|Data Storage Package || Y || 2.4.4 4.3 || 用于存储Jabberd数据的第三方包 || MySQL, PostgreSQL or Berkeley DB&lt;br /&gt;
|-&lt;br /&gt;
|Data Directory || Berkeley DB || 4.1.1, 4.2.1, || 用于存储Berkeley DB数据文件的目录 || /usr/local/var/jabberd/db &lt;br /&gt;
|-&lt;br /&gt;
|MySQL User and Password || MySQL || 3.5.2.2, 4.1.2, 4.2.2, || Jabberd用于连接MySQL的MySQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|PostgreSQL User and Password || PostgreSQL || 3.5.3.1, 1 3, 4.2.3, || Jabberd用于连接PostgreSQL的PostgreSQL用户名和密码 || user: jabberd2 password: secret&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Connection Settings || OpenLDAP || 2.5 || 用于你的OpenLDAP服务器连接设置: 指定LDAP服务器(或IP)的FQDN,端口,和LDAP使用的版本(要么v2要么v3) ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP User and Password || OpenLDAP || 4.2.5 || 连接到你的OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许匿名绑定(访问)时才需要 ||&lt;br /&gt;
|-&lt;br /&gt;
|OpenLDAP Query Settings || OpenLDAP || 4.2.5 || Base DN (识别名) 和 User ID 属性用于为OpenLDAP服务器建立查询. Base DN 可以要么是服务器的root DN 要么是一个可以在它那找到 User ID's 的 RDN (相对的识别名). ||&lt;br /&gt;
|-&lt;br /&gt;
|Hostname || Y || 4.4 || 你的安装了Jabberd服务器的主机名. 对于可从互联网访问的服务器, 看起来类似 somedomain.com ||&lt;br /&gt;
|-&lt;br /&gt;
|SSL Key Location || N || 5.3.1, 5.3.2 || OpenSSL证书文件的位置. 对于SSL加密通讯是必需的 || /usr/local/etc/jabberd/server.pem &lt;br /&gt;
|-&lt;br /&gt;
|Router User and Password || N || 5.4 || 用于别的组件连接到Jabberd Router组件的用户名和密码 || user: jabberd2 password: secret &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===新建Jabber用户和组===&lt;br /&gt;
&lt;br /&gt;
你应该新建一个jabber用户和组来运行服务器:&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Jabber User and Group'''&lt;br /&gt;
&lt;br /&gt;
新建一个用于运行Jabberd(作为超级用户)的用户和组:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          groupadd jabber&lt;br /&gt;
          useradd -g jabber jabber&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 检查你的用户和组命令'''&lt;br /&gt;
&lt;br /&gt;
以上命令只是一个例子. 在你的系统中增加一个用户和组的命令和参数可能不同. 如果对这些命令有任何疑问请参考手册.&lt;br /&gt;
&lt;br /&gt;
===为PID's和Logs新建目录===&lt;br /&gt;
&lt;br /&gt;
你应该为Jabberd新建一个目录来存储它的PID和log文件, 并让之前新建的用户拥有这些目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PID Directory'''&lt;br /&gt;
&lt;br /&gt;
为PID文件(作为超级用户)新建一个目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          su&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/pid/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/pid/     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上目录是Jabberd PID 文件的缺省的位置.&lt;br /&gt;
&lt;br /&gt;
你也可以选择为logs新建一个目录.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: Log Directory'''&lt;br /&gt;
&lt;br /&gt;
如果你想要, 为logs新建一个独立的目录, 并把所有权赋予你的jabber用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          mkdir -p /usr/local/var/jabberd/log/&lt;br /&gt;
          chown -R jabber:jabber /usr/local/var/jabberd/log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Log文件缺省为Syslog'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd缺省地把消息写到syslog. 为了强制Jabberd把它的logs写到上述目录, 必须编辑组件的XML文件以指定上述新建的目录.&lt;br /&gt;
&lt;br /&gt;
===安装先决条件===&lt;br /&gt;
&lt;br /&gt;
Jabberd2有四个先决条件:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openssl.org/ OpenSSL (版本0.9.6b或更高)]&lt;br /&gt;
* [http://www.gnu.org/software/libidn/ Libidn (版本0.3.0或更高)]&lt;br /&gt;
* 数据存储包&lt;br /&gt;
* 验证包&lt;br /&gt;
&lt;br /&gt;
技术上来讲, Jabberd 2的安装可以不需要OpenSSL或Libidn; 然而, 强烈推荐在安装Jabberd之前安装这些包. Jabberd 2也要求数据存储包用于应用和验证; 然而, 一个单独的包, 例如 MySQL, 也可能同时满足数据存储和验证的要求.&lt;br /&gt;
&lt;br /&gt;
====OpenSSL====&lt;br /&gt;
&lt;br /&gt;
OpenSSL为Jabber提供客户端到服务器以及服务器之间的通讯的加密. XMPP协议要求Jabber服务器支持TLS (传输安全层). TLS是SSL的继任者.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 最小OpenSSL版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖OpenSSL版本0.9.6b或更高. &lt;br /&gt;
&lt;br /&gt;
'''I 重要: OpenSSL升级问题'''&lt;br /&gt;
&lt;br /&gt;
如果你升级了OpenSSL, 你可能需要重新编译安装目前依赖于老版本OpenSSL的软件. 提出这个警告是因为很多工具依赖于OpenSSL, 而且OpenSSL升级之后这些工具可能停止运作. 建议谨慎地更新OpenSSL, 升级OpenSSL的详细指引超出了本文范围.&lt;br /&gt;
&lt;br /&gt;
更多信息请看[http://www.openssl.org/ OpenSSL]网站. OpenSSL下载在[http://www.openssl.org/source OpenSSL Source]页. 为Jabberd 2安装OpenSSL的指引在本指南的附录里. 参见[[Jabberd2:安装和管理指南#为Jabberd安装OpenSSL|为Jabberd安装OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
====Libidn====&lt;br /&gt;
&lt;br /&gt;
Libidn为Jabberd 2提供必要的字符处理功能. 在Jabberd 2稳定版3之前, libidn已经被包含在Jabberd 2分发版里; 然而, 版权冲突使得libidn必须提前独立安装.&lt;br /&gt;
&lt;br /&gt;
'''N 注意最小libidn版本'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2依赖于libidn版本0.3.0或更高.&lt;br /&gt;
&lt;br /&gt;
详见[http://www.gnu.org/software/libidn/ Libidn]网站. Libidn下载在[http://www.gnu.org/software/libidn/#downloading Libidn Source]页. 安装libidn指引在本指南的附录. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Libidn|为Jabberd安装Libidn]].&lt;br /&gt;
&lt;br /&gt;
====数据存储包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2对数据库集成的支持比以前更好了, 而且Jabberd 2能使用三种自由数据库之一来提供数据存储:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
MySQL是推荐以及缺省的数据存储. 文件也可以用来存储Jabberd 2数据; 然而, 这是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: MySQL和Unicode支持&lt;br /&gt;
&lt;br /&gt;
MySQL版本4.1和更高版本支持Unicode (UCS-2和UTF8) 字符编码. 如果你的安装需要支持多字母编码, 并且希望使用MySQL, 选择4.1或更高版本.&lt;br /&gt;
&lt;br /&gt;
如果你已安装了这些数据库中的一个, 你可以配置它为Jabberd工作. 反之, 你应该选择这些数据库中之一并在继续安装Jabberd之前安装它. MySQL是推荐的数据库; 然而, Berkeley DB 需要的安装和管理工作更少. 从而, 对于用户比较少的安装来说，Berkeley DB 也是理想的选择.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: MySQL需要开发库和头文件'''&lt;br /&gt;
&lt;br /&gt;
注意Jabberd需要的不止是最小的MySQL安装. 除了基本的MySQL安装, Jabberd要求开发库和头文件也要安装. 要么执行一个[http://www.mysql.com/downloads/mysql-4.0.html MySQL Downloads]页列出的''最大''安装, 要么独立的安装''服务器, 客户端程序, 库和头文件'', 以及''动态客户端库''. 为了安装附加的库，可能需要卸载当前的 MySQL安装. &lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
====验证包====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2能使用五种第三方数据包之一来处理用户验证: &lt;br /&gt;
&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://www.sleepycat.com/ Berkeley DB (4.1.24或更高版本)]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP (2.1.0或更高版本)]&lt;br /&gt;
* [http://www.kernel.org/pub/linux/libs/pam/ PAM]&lt;br /&gt;
&lt;br /&gt;
注意三种支持的一个应用数据包也被用于管理验证信息. 所以, 安装MySQL, Berkeley DB 或 PostgreSQL 之一同时满足了Jabberd数据包的要求. 可以用一个文件存储验证数据; 然而, 这是不推荐的. 推荐的和缺省的包是MySQL.&lt;br /&gt;
&lt;br /&gt;
如果你已经安装了以上五种验证数据包之一, 你可以配置它用于Jabberd 2. 如果没有, 你应该安装以上五个包中的一个或多个.&lt;br /&gt;
&lt;br /&gt;
本文的附录包括了为Jabberd 2安装MySQL或Berkeley DB的指引. 参见[[Jabberd2:安装和管理指南#为Jabberd安装Berkeley DB|为Jabberd安装Berkeley DB]]或[[Jabberd2:安装和管理指南#为Jabberd安装MySQL|为Jabberd安装MySQL]].&lt;br /&gt;
&lt;br /&gt;
==安装Jabberd 2==&lt;br /&gt;
&lt;br /&gt;
本章描述如何编译和安装Jabberd 2. &lt;br /&gt;
&lt;br /&gt;
===下载Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
'''F 必需的文件'''&lt;br /&gt;
&lt;br /&gt;
从 [http://jabberd.jabberstudio.org/2/ Jabber Studio]下载文件 ''jabberd-2.0sn.tar.gz'' , 这里 &amp;quot;n&amp;quot; 是Jabberd 2的最新稳定版本号.&lt;br /&gt;
&lt;br /&gt;
下载上述文件到一个 /home 下的目录，用于编译这些安装文件. 撰写本文的时候, Jabberd 2 稳定发布版3 是最新的版本并且用于下面的例子.&lt;br /&gt;
&lt;br /&gt;
===提取Jabberd安装文件===&lt;br /&gt;
&lt;br /&gt;
进入到你下载上述文件的目录然后通过命令行提取Jabberd 2文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      tar -zxvf  jabberd-2.0s3.tar.gz &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd编译===&lt;br /&gt;
&lt;br /&gt;
|| 待做: 准备重写配置指引使得它们更清晰. 也许放一些特别的配置到 FAQ ||&lt;br /&gt;
&lt;br /&gt;
进入上面建立的文件夹:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cd jabberd-2.0s3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 查看配置选项'''&lt;br /&gt;
&lt;br /&gt;
在配置Jabberd之前, 你可以查看所有配置选项，运营以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将提供一个设置配置选项的清单和语法. 例如, 你可以安装Jabberd到一个特定的目录，通过使用 --prefix=PREFIX 选项. 通过提供一个 PREFIX 路径, 所有的Jabberd文件将被安装在这个目录下. 如果你正在测试一个新的Jabberd安装,这可能很有用. 另一个有用的选项是 --enable-debug. 这个选项允许Jabberd提供详细的调试信息; 然而, 在生产系统上它应该慎用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 配置选项已经在稳定版本3中改变了'''&lt;br /&gt;
&lt;br /&gt;
Jabberd 2稳定版本3为配置脚本改变了一些参数. 以下信息属于Jabberd 2稳定版本3和更高版本.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 对于OpenSSL和Libidn使用明确的选项 &lt;br /&gt;
&lt;br /&gt;
推荐Jabberd 2把OpenSSL和Libidn配置成明确的选项. 这些包从技术上是可选的. 所以, 配置可以不用它们而编译Jabberd 2，如果当配置运行的时候它们的库和头文件没找到. &lt;br /&gt;
&lt;br /&gt;
'''P 参数: 应用程序数据包和验证数据包'''&lt;br /&gt;
&lt;br /&gt;
验证包和数据包应该以 --enable- 选项指定. 选项为 --enable-mysql, --enable-pgsql, --enable-db, --enable-pam or --enable-ldap. 尽管 --enable-mysql 是缺省的, 如果使用了MySQL，还是推荐指定它. 例如, 这个命令将被用于允许MySQL成为验证和存储包，但不支持调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ./configure --enable-mysql --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下命令将用于配置Jabberd使用Berkeley DB，同时用于存储和验证并允许调试:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-db --enable-debug --enable-ssl --enable-idn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果Jabberd的先决条件之一被安装在一个非标准的位置, 你将需要在运行配置的时候指定这个位置. 指定替代的头文件路径可以使用 --with-extra-include-path 选项，指定替代的库文件路径可使用 -with-extra-library-path 选项. 多路径, 分别位于不同克隆, 可以指定. 例如, 如果OpenSSL和MySQL被安装在 /usr/local, 你可以用以下指令配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-pgsql --enable-ssl --enable-idn \&lt;br /&gt;
      --with extra-include-path=/usr/local/include:/usr/local/include/mysql \&lt;br /&gt;
      --with-extra-library-path=/usr/local/lib:/usr/local/lib/mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 不正确的参数会被忽略'''&lt;br /&gt;
&lt;br /&gt;
Jabberd忽略不正确的配置参数. 因而, 一个不正确的配置参数可能仍会成功配置, 即使错误的Jabberd配置. 如果有疑问运行 ./configure --help .&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Redhat 9配置'''&lt;br /&gt;
&lt;br /&gt;
在Redhat 9编译Jabberd 2要求特定的配置，因为Redhat 9自带了自己的Kerberos版本. 详见 FAQ 中关于 Redhat 9 的部分. &lt;br /&gt;
&lt;br /&gt;
如果你希望使用缺省配置,简单地运行配置命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将配置Jabberd使用MySQL和安装到 /usr/local 目录. 如果你接收到错误, 你可能希望检查 FAQ，你将发现许多系统特定的工作环境.&lt;br /&gt;
&lt;br /&gt;
===编译Jabberd===&lt;br /&gt;
&lt;br /&gt;
编译Jabberd，运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===安装Jabberd===&lt;br /&gt;
&lt;br /&gt;
切换到超级用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      su&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
运行make install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===缺省文件位置===&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2安装完成了. 以下是一个缺省安装的文件位置列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      /usr/local/etc/jabberd     Jabberd Configuration Files&lt;br /&gt;
      /usr/local/bin       Jabberd Binaries (jabberd, c2s, resolver, router, s2s, sm)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===设置配置文件的所有权===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含密码; 所以, 你应该对这些文件设置所有权和许可，这样他们只能被你的jabber用户读和被root用户写. 使用你的配置文件的位置和你的jabberd用户, 设置这些文件的所有权:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown -R root:jabber /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 给这些文件设置许可，这样别人不能读写它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chmod -R 640 /usr/local/etc/jabberd/*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在, 只有你的jabber用户和和超级用户能读和编辑你的配置文件.&lt;br /&gt;
&lt;br /&gt;
'''O 可选的: 为配置文件建立符号连接'''&lt;br /&gt;
&lt;br /&gt;
如果你使用缺省的位置安装Jabberd, 你可能希望在 /etc 目录为配置文件新建一个符号连接(作为超级用户). 这将使你更容易找到和修改它们:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          ln -s /usr/local/etc/jabberd/ /etc/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jabberd 2现在安装完了. 继续下一章配置你的安装.&lt;br /&gt;
&lt;br /&gt;
==基本配置==&lt;br /&gt;
&lt;br /&gt;
本章为大多数基本配置和你的Jabberd 2的测试提供一个快速的路线图. Jabberd 2的基本安装包含这三个步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|设置主机名(sm.xml和c2s.xml)]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#对于存储和验证包的规定和配置|对于存储和验证包的规定和配置]]&lt;br /&gt;
# [[Jabberd2:安装和管理指南#测试服务器|测试服务器]]&lt;br /&gt;
&lt;br /&gt;
Jabberd 2是通过它的6个XML文件来配置的. 对于缺省的安装, 这些配置文件在 /usr/local/etc/jabberd/, 而且它们可以从 /etc/jabberd 访问，如果你为这个目录建立了符号连接的话. 注意如果你在前面第二章收集了必需的信息，本章更容易完成.&lt;br /&gt;
&lt;br /&gt;
===在sm.xml和c2s.xml设置主机名===&lt;br /&gt;
&lt;br /&gt;
基本配置的第一步包括在sm.xml 和 c2s.xml设置主机名.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Hostname&lt;br /&gt;
&lt;br /&gt;
你的服务器主机名(网络ID) 必须同时在 c2s.xml 和 sm.xml 里设置，这样这个 ID 为你的服务器提供一个可解析的引用. 在 c2s.xml 里，这个 ID 位于头标记为 Local network configuration 的位置(大约第63行), 在 sm.xml 里这个 ID 位于 Session manager configuration (第一行). 编辑 sm.xml 和 c2s.xml ，这样这个 ID 引用你的服务器.&lt;br /&gt;
&lt;br /&gt;
在 sm.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Session manager configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;sm&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Our ID on the network. Users will have this as the domain part of&lt;br /&gt;
             their JID. If you want your server to be accessible from other&lt;br /&gt;
             Jabber servers, this ID must be resolvable by DNS.s&lt;br /&gt;
             (default: localhost) --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 c2s.xml :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;local&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Who we identify ourselves as. This should correspond to the&lt;br /&gt;
             ID (host) that the session manager thinks it is. You can&lt;br /&gt;
             specify more than one to support virtual hosts, as long as you&lt;br /&gt;
             have additional session manager instances on the network to&lt;br /&gt;
             handle those hosts. The realm attribute specifies the auth/reg&lt;br /&gt;
             or SASL authentication realm for the host. If the attribute is&lt;br /&gt;
             not specified, the realm will be selected by the SASL&lt;br /&gt;
             mechanism, or will be the same as the ID itself. Be aware that&lt;br /&gt;
             users are assigned to a realm, not a host, so two hosts in the&lt;br /&gt;
             same realm will have the same users.&lt;br /&gt;
             If no realm is specified, it will be set to be the same as the&lt;br /&gt;
             ID. --&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;somemachine.somedomain.com&amp;lt;/id&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如在 c2s.xml 文件看到的, 这个主机名将被加到你的用户名后面以建立Jabber ID's, 而且为了Jabberd能通过互联网访问，它必须可通过DNS解析，.&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
你可以仅使用一个域名(somedomain.com) 给你的Jabberd 2网络ID，如果你的DNS之前被配置成解析那个ID到你的服务器. 关于为Jabberd 2设置 DNS SRV 记录的信息，参见[[Jabberd2:安装和管理指南#设置DNS的SRV记录|5.7章]].&lt;br /&gt;
&lt;br /&gt;
===对存储和验证包的提供和配置===&lt;br /&gt;
&lt;br /&gt;
要让Jabberd 2和你选择的外部存储和验证包一起工作，包括这些步骤:&lt;br /&gt;
&lt;br /&gt;
# 提供和Jabberd 2协作的外部包&lt;br /&gt;
# 为你选择的存储包配置 sm.xml&lt;br /&gt;
# 为你选择的验证包配置 c2s.xml&lt;br /&gt;
&lt;br /&gt;
大多数 Jabberd 2 安装包依赖于单个包, 例如 MySQL, 来同时提供存储和验证服务. 如果你的安装包依赖于单个的包, 你将需要为Jabberd 2配置这个包，并且在 sm.xml 和 c2s.xml里都加入类似的连接信息.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据存储和验证包'''&lt;br /&gt;
&lt;br /&gt;
跟随本指南，为你选择的存储和验证包完成有关的条款. (用于存储的 Berkeley DB, MySQL 或 PostgreSQL. 用于验证的 Berkeley DB, MySQL, PostgreSQL, PAM 或 OpenLDAP.)&lt;br /&gt;
&lt;br /&gt;
跳到你选择的外部存储包开始: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置BerkeleyDB|提供和配置Berkeley DB]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置MySQL|提供和配置MySQL]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PostgreSQL|提供和配置PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
然后你将被引导继续提供(如果需要) 和配置你的验证包. 一旦你的外部包准备好了, 并且Jabberd被配置好使用它们, 你将进入[[Jabberd2:安装和管理指南#测试服务器|服务器测试]].&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04/html2pdf 以pdf格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置BerkeleyDB===&lt;br /&gt;
&lt;br /&gt;
[http://www.sleepycat.com/ Berkeley DB] 提供最简单的方法来让你的Jabberd 2服务器快速启动运行. Jabberd 2需要的最低版本是 4.1.24 或更高.&lt;br /&gt;
&lt;br /&gt;
====提供BerkeleyDB====&lt;br /&gt;
&lt;br /&gt;
如果你把Berkeley DB用来存储或验证，请完成本节. 让你的系统提供Berkeley DB是很简单的. Berkeley DB只需要一个目录存储数据文件, 而jabber用户或组拥有这个目录的所有权.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:新建一个目录并为Berkeley DB设置权限 (使用之前已经建立的用户和组). (以超级用户身份):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
           mkdir -p /usr/local/var/jabberd/db&lt;br /&gt;
           chown -R jabber:jabber /usr/local/var/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Berkeley DB已经准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用BerkeleyDB(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来存储，请完成本节. Jabberd 2要求的最低配置是使用Berkeley DB作为后端存储. 简单地设定使用的驱动并指定数据库的位置.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里的 ''Storage database configuration'' (存储数据库配置)段落, 编辑 ''driver'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;db&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里的 ''Berkeley DB driver configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB driver configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2贝配置成使用Berkeley DB存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用别的Berkeley DB之外的包作为验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.3.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用BerkeleyDB(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用Berkeley DB来验证，请完成本节. Jabberd 2对于Berkeley DB验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用 ''db'' (Berkeley DB):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;db&amp;lt;/module&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: 数据目录'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''Berkeley DB module configuration'' 段落, 为你的数据库设定路径 (在上面 4.3.1. 建立的):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Berkeley DB module configuration --&amp;gt;&lt;br /&gt;
          &amp;lt;db&amp;gt;&lt;br /&gt;
            &amp;lt;!-- Directory to store database files under --&amp;gt;&lt;br /&gt;
            &amp;lt;path&amp;gt;/usr/local/var/jabberd/db&amp;lt;/path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;!-- Synchronize the database to disk after each write. If you&lt;br /&gt;
                 disable this, database accesses may be faster, but data may&lt;br /&gt;
                 be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
            &amp;lt;sync/&amp;gt;&lt;br /&gt;
          &amp;lt;/db&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_3/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置MySQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.mysql.com/ MySQL] 是用于存储和验证的缺省的Jabberd 2包. &lt;br /&gt;
&lt;br /&gt;
====提供MySQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储 和/或 验证请完成本节. 为了给Jabberd配置MySQL, 你必须运行Jabberd 2分发包里带的安装脚本. 脚本运行之后, 你应该新建衣蛾用户并赋予数据库权限. &lt;br /&gt;
&lt;br /&gt;
首先, 运行MySQL安装脚本. 这个脚本位于Jabberd源码目录下的/tools子目录. 切换到tools目录并启动MySQL控制台(MySQL服务应该已经在运行中). 然后, 从MySQL控制台运行 ''db-setup.mysql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
   mysql -u root -p&lt;br /&gt;
   mysql&amp;gt;\. db-setup.mysql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在一个用于Jabberd的数据库已经存在于MySQL数据目录, 新建一个MySQL用户给Jabberd用来连接MySQL服务器.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:从MySQL控制台, 运行以下SQL指令, 用你选择的Jabberd MySQL用户的密码替换 ''secret'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 GRANT select,insert,delete,update ON jabberd2.* &lt;br /&gt;
      to jabberd2@localhost IDENTIFIED by 'secret';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意密码 secret 是Jabberd配置文件中用于MySQL的缺省密码.&lt;br /&gt;
&lt;br /&gt;
MySQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 缺省的MySQL Socket'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2稳定版3 连接MySQL服务器的socket位于 ‘’/tmp/mysql.sock‘’ . 从源码安装MySQL时的缺省socket是 ‘’/var/lib/mysql/mysql.sock‘’ . 如果 ‘’/tmp/mysql.sock‘’ 不存在,你需要新建一个软连接: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不确定你的MySQL服务器的socket在哪, 参考你的MySQL配置文件(通常位于 ''/etc/my.cnf'' 或 ''/etc/mysql/my.cnf'' ).&lt;br /&gt;
&lt;br /&gt;
====配置存储使用MySQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL存储，请完成本节. 大多数使用MySQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 ''mysql'' . (缺省这driver应该被设为mysql.): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;mysql&amp;lt;/driver&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''MySQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!-- MySQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes.&lt;br /&gt;
&lt;br /&gt;
             This will need to be disabled if you are using a MySQL&lt;br /&gt;
             earlier than v3.23.xx, as transaction support did not appear&lt;br /&gt;
             until this version. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用MySQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于MySQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.4.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用MySQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用MySQL来验证，请完成本节. Jabberd 2对于MySQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用 ''mysql'' (驱动缺省应该就是mysql):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: MySQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''MySQL module configuration'' 段落, 把 ''secret'' 替换成你的MySQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- MySQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;mysql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;3306&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的MySQL服务器运行在另一个主机上你才应该修改host设置. 只有你的MySQL服务器运行在一个非标准端口(3306是MySQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_4/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PostgreSQL===&lt;br /&gt;
&lt;br /&gt;
[http://www.postgresql.org/ PostgreSQL] 和MySQL一样，提供一个非常易于管理的后端用于存储和验证. 和MySQL不同的是, PostgreSQL提供了更好的 unicode支持.&lt;br /&gt;
&lt;br /&gt;
====提供PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储 和/或 验证请完成本节. 为了给Jabberd配置PostgreSQL, 你必须新建一个数据库，新建一个PostgreSQL用户并运行Jabberd 2分发包里带的PostgreSQL脚本. &lt;br /&gt;
&lt;br /&gt;
为Jabberd新建数据库. (PostgreSQL服务器应该已经在运行): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上命令讲新建一个数据库，你可以在那个数据库运行接哦本来安装Jabberd PostgreSQL数据库.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Unicode支持'''&lt;br /&gt;
&lt;br /&gt;
:如果你希望为你的PostgreSQL数据库激活Unicode支持, 把以上命令修改如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createdb -U postgres -E UNICODE jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:新建你的Jabberd数据库用户, 输入以下命令: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      createuser -P -U postgres jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个命令将初始化一个交互用户创建脚本. 当看到提示, 输入将来用于连接到你的PostgreSQL数据库的Jabberd的密码: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      Enter password for user &amp;quot;jabberd2&amp;quot;:&lt;br /&gt;
      Enter it again:&lt;br /&gt;
      Shall the new user be allowed to create databases? (y/n) n&lt;br /&gt;
      Shall the new user be allowed to create more new users? (y/n) n&lt;br /&gt;
      CREATE USER&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''CREATE USER'' 信息表示命令执行成功.&lt;br /&gt;
&lt;br /&gt;
在你的jabberd用户创建之后, 你已经准备好运行PostgreSQL安装脚本了. 这个脚本位于 '\[Jabberd Source Files\]\/tools'. 切换到 ''tools'' 目录并以jabberd2用户身份启动PostgreSQL控制台: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      psql -U jabberd2 jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 从PostgreSQL控制台运行 ''db-setup.pgsql'' 脚本: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      jabberd2=&amp;gt;\i db-setup.pgsql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL现在准备好用于Jabberd了.&lt;br /&gt;
&lt;br /&gt;
====配置存储使用PostgreSQL(sm.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL存储，请完成本节. 大多数使用PostgreSQL存储的安装只需要设置驱动, 用户和密码.&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''Storage database configuration'' 的段落下, 确保 ''driver'' 是用 pgsql (PostgreSQL): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Storage database configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;storage&amp;gt;&lt;br /&gt;
          &amp;lt;!-- By default, we use the MySQL driver for all storage --&amp;gt;&lt;br /&gt;
          &amp;lt;driver&amp;gt;pgsql&amp;lt;/driver&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''sm.xml'' 里标为 ''PostgreSQL driver configuration'' 的段落下, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL driver configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Transaction support. If this is commented out, transactions&lt;br /&gt;
             will be disabled. This might make database accesses faster,&lt;br /&gt;
             but data may be lost if jabberd crashes. --&amp;gt;&lt;br /&gt;
        &amp;lt;transactions/&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置. transaction support 段落则是不言自明的了.&lt;br /&gt;
&lt;br /&gt;
现在Jabberd 2已经配置成使用PostgreSQL来存储了.&lt;br /&gt;
&lt;br /&gt;
如果你希望使用一个不同于PostgreSQL的验证包, 跳到你选择的验证包:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置PAM|提供和配置PAM]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#提供和配置OpenLDAP|提供和配置OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
否则, 继续到 4.5.3. 直接往下完成你的Jabberd 2配置.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PostgreSQL(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PostgreSQL来验证，请完成本节. Jabberd 2对于PostgreSQL验证配置的要求同上，除了包含在 ''c2s.xml'' 的信息.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 确保 ''driver'' 使用pgsql (PostgreSQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pgsql&amp;lt;/module&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: PostgreSQL用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''PostgreSQL module configuration'' 段落, 把 ''secret'' 替换成你的PostgreSQL密码. 如果你不使用缺省用户(jabberd2)则还要修改用户名 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- PostgreSQL module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;pgsql&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Database server host and port --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5432&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database name --&amp;gt;&lt;br /&gt;
        &amp;lt;dbname&amp;gt;jabberd2&amp;lt;/dbname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Database username and password --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd2&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;&lt;br /&gt;
      &amp;lt;/pgsql&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意只有你的PostgreSQL服务器运行在另一个主机上你才应该修改host设置. 只有你的PostgreSQL服务器运行在一个非标准端口(5432是PostgreSQL安装后的缺省端口)你才应该修改port设置.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了. 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_5/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置PAM===&lt;br /&gt;
&lt;br /&gt;
[http://www.kernel.org/pub/linux/libs/pam/ PAM](Linux的可插拔验证模块)为Jabberd 2提供内建的验证支持.&lt;br /&gt;
&lt;br /&gt;
====提供PAM====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM验证请完成本节. 通过PAM验证需要一个有效的PAM配置文件 ''jabberd'' . 对于多数系统, 这个配置文件应该位于 ''/etc/pam.d'' .创建 Jabberd PAM配置文件超出了本指南的范围; 无论如何, 创建这个配置文件有个捷径. 拷贝 ''system-auth'' 配置文件到 ''jabberd'' (以root身份): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      cp /etc/pam.d/system-auth /etc/pam.d/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将新建一个PAM配置文件给Jabberd2使用.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: PAM验证需要访问PAM数据库'''&lt;br /&gt;
&lt;br /&gt;
:通过PAM做Jabberd验证需要Jabberd2有权访问PAM数据库. 对多数系统, 该数据库就是 ''/etc/shadow'' 文件. 因此, Jabberd2必须以root身份运行, 或jabberd用户必须被授予对此文件的读权限. 以root身份运行Jabberd2服务是不推荐的.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Winbind可用于集成NT验证到PAM'''&lt;br /&gt;
&lt;br /&gt;
:来自Samba项目的Winbind包可被用于支持通过Windows NT做Jabber验证. 当Winbind成功安装并配置之后, 配置Jabberd使用PAM来验证. 然后新建jabberd PAM配置文件如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      auth       required     pam_winbind.so&lt;br /&gt;
      password   required     pam_winbind.so&lt;br /&gt;
      account    required     pam_winbind.so&lt;br /&gt;
      session    required     pam_winbind.so      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PAM现在准备好用于Jabberd了. 接下来开始配置通过PAM做Jabberd 2验证.&lt;br /&gt;
&lt;br /&gt;
====配置验证使用PAM(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用PAM来验证，请完成本节. Jabberd 2需要一点配置来使用PAM.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''module'' 使用pam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;pam&amp;lt;/module&amp;gt;         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用户不能创建他们自己的帐号当使用PAM验证时. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_6/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===提供和配置OpenLDAP===&lt;br /&gt;
&lt;br /&gt;
[http://www.openldap.org/ OpenLDAP]提供分布式跨平台跨地区的验证支持. Jabberd 2要求的最低版本是OpenLDAP 2.1.0.&lt;br /&gt;
&lt;br /&gt;
====提供OpenLDAP ====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP验证请完成本节. 你安装的OpenLDAP应该不需要为Jabberd 2特别配置; 无论如何, 在撰写本文的此刻(Jabberd 2稳定版3), 关于使用Jabberd连接OpenLDAP v3服务器有一个重要的问题. 目前Jabberd 2使用v2的语法. 缺省的, OpenLDAP v3服务器要求使用v3语法.&lt;br /&gt;
&lt;br /&gt;
有一个办法来解决这个问题. 添加以下声明到你的 slapd.conf 文件, 并重启你的 slapd 守护进程: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      allow bind_v2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置验证使用OpenLDAP(c2s.xml)====&lt;br /&gt;
&lt;br /&gt;
如果你使用OpenLDAP来验证，请完成本节. OpenLDAP配置更详细，因为配置需要主机，连接以及查询设置.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 的 ''Authentication/registration database configuration'' （验证/注册 数据库配置）段落, 编辑 ''driver'' 使用ldap(OpenLDAP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;ldap&amp;lt;module&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP连接设置'''&lt;br /&gt;
&lt;br /&gt;
:在 ''c2s.xml'' 的 ''LDAP module configuration'' 的第一个部分处理连接你的OpenLDAP服务器所需要的设置. ''host'' 必须要么是这个OpenLDAP服务器的可以被服务器解析的主机名要么是它的IP地址. 端口389是OpenLDAP服务器的缺省端口, 所以大部分情况下, ''port'' 应该放在那不动. ''v3'' 标签指明你的OpenLDAP服务器是否v3版本. 如果是，取消这个标签的注释. 如果使用OpenLDAP v2服务器则保留注释 ''v3'' 标签. 最后, 如果你的服务器支持加密(参见下面的备注)，则取消注释 ''starttls'' 或 ''ssl'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.example.com&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 密码是明文传送的'''&lt;br /&gt;
&lt;br /&gt;
:目前本本的Jabberd 2 (stable 3)通过OpenLDAP验证时需要使用明文密码. 所以, 允许加密是绝对重要的. 如上所述, 加密选项只在连接OpenLDAP v3服务器时有效. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 加密选项'''&lt;br /&gt;
&lt;br /&gt;
:作者已经成功的使用Jabberd 2和STARTTLS连接到一个OpenLDAP服务器的最新版本. STARTTLS运行于标准端口(389), 所以允许STARTTLS需要做的就是取消注释 ''v3'' 和 ''starttls'' 标签. 另一方面, 作者未能成功的使用SSL加密连接Jabberd 2和OpenLDAP. 要设置SSL, 你应该指定OpenLDAP SSL 主机名(如果不同于 非SSL 主机名). 通常类似于 ''ldaps.example.com'' . 更重要的是, 你应该指定SSL端口. OpenLDAP的标准SSL端口(LDAPS)是636. 最后, 你应该取消注释 ''ssl'' 标签.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: OpenLDAP用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:OpenLDAP配置的下一部分处理查询OpenLDAP服务器的用户名和密码. 只有你的OpenLDAP服务器不允许为必需的搜索匿名绑定(验证)的时候才需要一个用户名和密码. 如果你的OpenLDAP服务器的连接要求验证取消注释这个段落. 注意 ''binddn'' 是用户的完整RDN(相对可分辨名称). 可能类似于 ''cn=admin,ou=people,dc=example,dc=com'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
           will be done anonymously. --&amp;gt;&lt;br /&gt;
      &amp;lt;!--&lt;br /&gt;
      &amp;lt;binddn&amp;gt;cn=Directory Manager&amp;lt;/binddn&amp;gt;&lt;br /&gt;
      &amp;lt;bindpw&amp;gt;secret&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: LDAP查询设置'''&lt;br /&gt;
&lt;br /&gt;
:最后, 必须为OpenLDAP查询设置用户ID和基础DN. 用户ID由 ''uidattr'' 标签指定. 这个ID应该是你的用户在特定基础DN(可分辨的名称)的唯一性标识的属性. 换句话说, 当查询指定的基础DN时, 这个特定的 ''uidattr'' 应该是唯一性地标识每个用户. ''basedn'' 属性指定查询运行的基础. 这可能是该OpenLDAP服务器的顶级DN, 例如 ''dc=example,dc=com'' 或着它可能是一个专门存放用户条目的RDN, 例如 ''ou=people,ou=sales,dc=example,dc=com'' . 使用一个低级的RDN好像可以加速OpenLDAP查询. 最后, 如果你的配置要求多个域, 你可以在 ''basedn'' 标签使用 ''realm'' 属性，为每个域指定一个基础DN. 注意如果你没有使用多个域, 就只需要指定一个单独的 ''basedn'' 而不需要 ''realm'' 属性: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
      &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
           authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
           by using the realm attribute. --&amp;gt;&lt;br /&gt;
      &amp;lt;basedn realm='company'&amp;gt;o=Company.com&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;basedn&amp;gt;o=Example Corp.&amp;lt;/basedn&amp;gt;&lt;br /&gt;
    &amp;lt;/ldap&amp;gt;        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是一个笔者工作中的OpenLDAP配置的展示: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- LDAP module configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;ldap&amp;gt;&lt;br /&gt;
        &amp;lt;!-- LDAP server host and port (default: 389) --&amp;gt;&lt;br /&gt;
        &amp;lt;host&amp;gt;ldap.mydomain.org&amp;lt;/host&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;389&amp;lt;/port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Use LDAP v3 if possible. If disabled, v2 will be used.&lt;br /&gt;
             Encryption options are only available if v3 is enabled. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;v3/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the LDAP server using the LDAP STARTTLS mechanism. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;starttls/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Encryption. If enabled, this will create an encrypted channel&lt;br /&gt;
             to the server using the old-style &amp;quot;ldaps://&amp;quot; mechanism. It is&lt;br /&gt;
             recommended that you use &amp;lt;starttls/&amp;gt; instead of this. --&amp;gt;&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;ssl/&amp;gt;&lt;br /&gt;
        --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- DN to bind as for searches. If unspecified, the searches&lt;br /&gt;
             will be done anonymously. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!--&lt;br /&gt;
        &amp;lt;binddn&amp;gt;cn=admin,dc=mydomain,dc=org&amp;lt;/binddn&amp;gt;&lt;br /&gt;
        &amp;lt;bindpw&amp;gt;snip&amp;lt;/bindpw&amp;gt;&lt;br /&gt;
        --&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- LDAP attribute that holds the user ID (default: uid) --&amp;gt;&lt;br /&gt;
        &amp;lt;uidattr&amp;gt;uid&amp;lt;/uidattr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- base DN of the tree. You should specify a DN for each&lt;br /&gt;
             authentication realm declared in the &amp;lt;local/&amp;gt; section above,&lt;br /&gt;
             by using the realm attribute. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;basedn&amp;gt;ou=people,ou=design,dc=mydomain,dc=org&amp;lt;/basedn&amp;gt;&lt;br /&gt;
      &amp;lt;/ldap&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当使用OpenLDAP验证时用户不能创建他们自己的帐号. 所以, 应该禁止公开帐号注册, 同时激活 ''auto-create'' ,这样会话管理器可以在用户第一次登录时自动创建帐号.&lt;br /&gt;
&lt;br /&gt;
在 ''c2s.xml'' 里的 ''Authentication/registration database configuration'' 段落里查找 ''Registration configuration'' 子段落. 如下注释掉 ''enable'' 标签将禁止公开注册: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;register&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
             auth/reg module in use supports it). Comment this out to&lt;br /&gt;
             disable. --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- &amp;lt;enable/&amp;gt; --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 里标为 ''User options'' 的段落 (靠近文件底部), 如下取消注释 ''auto-create'' 标签，这样会话管理器将在用户初次登录时创建一个信的Jabberd2帐号: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- User options --&amp;gt;&lt;br /&gt;
      &amp;lt;user&amp;gt;&lt;br /&gt;
        &amp;lt;!-- By default, users must explicitly created before they can start&lt;br /&gt;
             a session. The creation process is usually triggered by a c2s&lt;br /&gt;
             component in response to a client registering a new user.&lt;br /&gt;
&lt;br /&gt;
             Enableing this option will make it so that a user create will be&lt;br /&gt;
             triggered the first time a non-existant user attempts to start&lt;br /&gt;
             a session. This is useful if you already have users in an&lt;br /&gt;
             external authentication database (eg LDAP) and you don't want&lt;br /&gt;
             them to have to register. --&amp;gt;&lt;br /&gt;
        &amp;lt;auto-create/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2的存储和验证配置现在完成了(前提是你得提供和配置好存储包). 在转移到其他配置任务(例如 [[Jabberd2:安装和管理指南#通用配置任务|第五章]] 的配置SSL)之前，跳到 [[Jabberd2:安装和管理指南#测试服务器|测试服务器]] 去开始测试你的服务器.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_7/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
===测试服务器===&lt;br /&gt;
&lt;br /&gt;
设置好主机名, 提供了外部包, 并配置Jabberd使用外部包之后, 你的服务器已经准备好测试了.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 启动你的服务器'''&lt;br /&gt;
&lt;br /&gt;
:你应该可以使用Jabberd 2启动脚本(以你的jabber用户身份)启动并测试你的Jabberd 2服务器，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su&lt;br /&gt;
        su jabber&lt;br /&gt;
        cd /usr/local/bin&lt;br /&gt;
        ./jabberd &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 疑难解答'''&lt;br /&gt;
&lt;br /&gt;
:如果Jabberd无法启动, 确保任何之前的实例已经停止. 这些实例包括所有Jabberd运行时组件( ''jabberd'' , ''router'' , ''resolver'' , ''sm'' , ''s2s'' 和 ''c2s'' ). 注意你的jabber用户(如果按第二章的说明创建了的话.) 可能没有缺省路径; 所以, 你应该 ''cd''  到 ''/usr/local/bin'' 目录并如上运行 ''jabberd'' . 检查你选择的数据包服务器是否正常运行(除了Berkeley DB, 它不需要启动). 检查你的 ''syslog'' 查看错误信息. 如果你的服务器启动失败, 你可以用debug选项启动Jabberd 2(注意这需要在编译Jabberd 2时带上debug选项 — 参见[[Jabberd2:安装和管理指南#配置Jabberd编译|3.3章]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        /usr/local/bin/jabberd -D&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''I 重要: Jabberd 2不应该用超级用户运行'''&lt;br /&gt;
&lt;br /&gt;
:和所有守护进程一样, Jabberd 2不应该以超级用户身份运行. 以超级用户身份运行Jabberd 2不仅对系统有破坏的风险, 而且可能导致创建文件许可的问题.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 公开注册'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd2缺省允许新用户公开注册. 因此, 测试你的服务器时, 你能通过使用新用户名登录来新建一个用户.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从同网络的一台机器连接'''&lt;br /&gt;
&lt;br /&gt;
:一旦你检查你的服务器已经正常启动, 尝试从一个同网络的机器连接. 在一个Jabber客户端, 输入一个JID(Jabber ID)，使用你在[[Jabberd2:安装和管理指南#在sm.xml和c2s.xml设置主机名|4.1章]] ''sm.xml'' 设置的ID, 并尝试连接到你的服务器.&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 从远程网络的客户端连接'''&lt;br /&gt;
&lt;br /&gt;
:如果你可以从同网络连接到你的服务器, 那么使用一个Jabber客户端从一个远程网络连接它. 这将测试那个 ''id'' 是否正确设以及机器名是否正确的进行DNS解析.&lt;br /&gt;
&lt;br /&gt;
你的Jabberd 2服务器现在准备好使用了. 继续到 [[Jabberd2:安装和管理指南#常规配置任务|常规配置任务]] 了解更详细的配置选项, 例如允许SSL连接等.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section04_8/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规配置任务==&lt;br /&gt;
&lt;br /&gt;
在进入详细的Jabberd配置之前, 这里尝试为大部分常规的Jabberd配置任务提供一个指南: &lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#为互联网访问配置防火墙|为互联网访问配置防火墙]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|配置Jabberd 2使用SSL连接]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#修改Router密码|修改Router密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#创建管理员用户|创建管理员用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#禁止公开注册|禁止公开注册]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#允许用户修改密码|允许用户修改密码]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#设置DNS SRV记录|设置DNS SRV记录]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|使用Jabberd 1.4连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|使用JCR连接外部服务]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#安装一个使用Users-Agent的JUD|安装一个使用Users-Agent的JUD]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#集成vCard数据到Users-Agent(仅限私有服务器)|集成vCard数据到Users-Agent(仅限私有服务器)]]&lt;br /&gt;
&lt;br /&gt;
注意有两个选项用于连接Jabberd 1.4外部服务到你的Jabberd 2安装. Jabberd 2可以连接到服务例如会议和网关, 运行一个Jabberd 1.4进程. 另外, 一个名为JCR的组件封装器已经发布了, 这个封装器允许一个Jabber 1.4组件(用C写的)被编译后以Jabberd 2服务运行. 本文撰写期间, JCR只和MU Conferencing测试通过了.&lt;br /&gt;
&lt;br /&gt;
===为互联网访问配置防火墙===&lt;br /&gt;
&lt;br /&gt;
尽管防火墙配置超出了本文范围, 管理员应该注意TCP端口需要被允许通过互联网访问:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 — 非SSL客户端通讯&lt;br /&gt;
* 端口 5223 — SSL客户端通讯&lt;br /&gt;
* 端口 5269 — 服务器间通讯&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2安装是用于互联网访问，根据你的配置，以上TCP端口应该被允许.&lt;br /&gt;
&lt;br /&gt;
===配置Jabberd 2使用SSL连接===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2不仅为Jabberd客户端和服务器之间提供STARTTLS和SSL连接, 而且在Jabberd服务组件( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )和Jabberd ''router'' 之间也提供. 这两个功能(Jabber客户端到Jabberd以及Jabberd组件到router)可以共用一个SSL证书, 也可以使用独立的密钥. 如何为Jabberd 2创建你自己的自签名证书，参见附录 [http://www.jabberdoc.org/app_sslkey.html 生成自签名的SSL证书].&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 自签名证书是不被信任的'''&lt;br /&gt;
&lt;br /&gt;
:注意自签名证书不会自动被Jabber客户端信任，因为没有信任链来验证授权. 然而, 新建一个自签名证书不仅让你的Jabber用户可以通过一个安全通道连接(客户端可能会显示一个警告), 而且这样一个证书将为5个Jabberd组件( ''router'' , ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' )之间提供安全通讯. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 添加证书到PSI Jabber客户端'''&lt;br /&gt;
&lt;br /&gt;
:我已经写了一个脚本接收和添加自签名证书到PSI客户端证书仓库. 它在 [http://www.jabberdoc.org/tools tools目录] 的 [http://www.jabberdoc.org/tools/add_psi_cert.sh 这里] 并且已经生效.&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabber客户端的证书====&lt;br /&gt;
&lt;br /&gt;
用于Jabber客户端的SSL密钥的配置位于 ''c2s.xml'' . 注意 ''c2s.xml'' 包含用于Jabber客户端的SSL密钥的位置和用于 ''c2s'' 到 ''router'' 通讯的SSL密钥的位置.&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在标为 ''Local network configuration'' 的位置取消注释 ''pemfile'' (你的SSL密钥), 并把它改成你的SSL密钥的路径. 注意如果你的PEM文件在缺省位置 ''/usr/local/etc/jabberd/server.pem'' , 你只需要取消注释以下这个段落: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- File containing a SSL certificate and private key for client&lt;br /&gt;
             connections. If this is commented out, clients will not be&lt;br /&gt;
             offered the STARTTLS stream extension --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上修改将在5222端口激活STARTTLS. 旧的Jabber客户端使用5223端口来进行SSL通讯. 如果你希望在5223端口支持SSL, 取消注释 ''ssl-port'' 标签: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ssl-port&amp;gt;5223&amp;lt;/ssl-port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的服务器现在准备好STARTTLS/SSL连接了. 你只需要重启C2S组件就可以使SSL的配置变更生效了.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 禁止非STARTTLS通讯'''&lt;br /&gt;
&lt;br /&gt;
:强制要求STARTTLS通讯, 取消注释 ''require-starttls'' 标签，如下: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Require STARTTLS. If this is enabled, clients must do STARTTLS&lt;br /&gt;
             before they can authenticate. Until the stream is encrypted,&lt;br /&gt;
             all packets will be dropped. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;require-starttls/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====分配一个用于Jabberd组件的证书====&lt;br /&gt;
&lt;br /&gt;
5个Jabberd组件都要各自配置 组件到路由器 的加密通讯. 因此, 这5个配置文件都必须修改并提供Jabberd组件之间的安全通讯: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router.xml&lt;br /&gt;
        sm.xml&lt;br /&gt;
        resolver.xml&lt;br /&gt;
        s2s.xml&lt;br /&gt;
        c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''P 参数: SSL密钥位置'''&lt;br /&gt;
&lt;br /&gt;
:在以上每一个文件中, 取消注释 ''pemfile'' 标签用于路由器通讯. 在 ''router.xml'' 文件, ''pemfile'' 被定义在标为 ''Local network configuration'' 的段落. 在以上剩下的四个配置文件的每个文件里面, ''pemfile'' 定义于标为 ''Router connection configuration'' 的段落. 取消注释这个段落并修改它指向你的SSL密钥的位置. 例如, 你讲修改 ''c2s.xml'' 如下，如果你的SSL密钥使用缺省路径: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;router&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
          &amp;lt;pass&amp;gt;secret&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- File containing a SSL certificate and private key to use when&lt;br /&gt;
               setting up an encrypted channel with the router. If this is&lt;br /&gt;
               commented out, or the file can't be read, no attempt will be&lt;br /&gt;
               made to establish an encrypted channel with the router. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;pemfile&amp;gt;/usr/local/etc/jabberd/server.pem&amp;lt;/pemfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务使配置变更生效.&lt;br /&gt;
&lt;br /&gt;
===修改Router密码===&lt;br /&gt;
&lt;br /&gt;
Jabberd配置文件包含了组件连接到路由器的密码，因为组件和路由器之间的通讯是通过TCP/IP上的XML实现的. 这些密码帮助确保只有你安装的组件可以和路由器通讯. 配置文件, ''router-users.xml'' , 包含了允许连接到路由器的ID和密码. 缺省的ID是 ''jabberd'' 密码是 ''secret'' . &lt;br /&gt;
&lt;br /&gt;
另外, 每个组件(除了 ''router'' )在它的配置文件里都有一个用户ID和密码. 这个ID和密码配合给各自的组件用来连接 ''router'' . 因此, 对一个可以连接到路由器的组件来说, 该组件的配置文件里必须有一个用户名和密码组合, 并且那个组合必须和 ''router-users.xml'' 的ID和密码组合匹配.&lt;br /&gt;
&lt;br /&gt;
为了给Jabberd安装你的提高安全性, 你应该修改密码. 这包括修改 ''router-users.xml'' 以及 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' .&lt;br /&gt;
&lt;br /&gt;
'''P 参数: Router用户名和密码'''&lt;br /&gt;
&lt;br /&gt;
:为了修改路由器验证用的密码, 首先修改 ''router-users.xml'' 如下(用新密码替换掉 ''newpass'' ): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;users&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;jabberd&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;newpass&amp;lt;/secret&amp;gt;&lt;br /&gt;
        &amp;lt;/user&amp;gt;&lt;br /&gt;
      &amp;lt;/users&amp;gt;    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 修改 ''sm.xml'' , ''resolver.xml'' , ''s2s.xml'' 和 ''c2s.xml'' 中的密码 . 在每个文件中的 ''router'' 段落有一些标签是给路由器用户的. 修改密码如下(用新密码替换掉 ''newpass'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Router connection configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;router&amp;gt;&lt;br /&gt;
        &amp;lt;!-- IP/port the router is waiting for connections on --&amp;gt;&lt;br /&gt;
        &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;      &amp;lt;!-- default: 127.0.0.1 --&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;       &amp;lt;!-- default: 5347 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Username/password to authenticate as --&amp;gt;&lt;br /&gt;
        &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;    &amp;lt;!-- default: jabberd --&amp;gt;&lt;br /&gt;
        &amp;lt;pass&amp;gt;newpass&amp;lt;/pass&amp;gt;     &amp;lt;!-- default: secret --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd服务器使变更生效.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 允许多密码'''&lt;br /&gt;
&lt;br /&gt;
:注意如果你需要，可以为每一个组件分配一个用户和ID. &lt;br /&gt;
&lt;br /&gt;
'''N 注意: 如果用户变更那么 ''router.xml'' 必须修改'''&lt;br /&gt;
&lt;br /&gt;
:注意以上只描述了如何修改路由器密码. 如果 ''router-users.xml'' 中的用户名修改了, 那么 ''router.xml'' 中的 ''acl'' 段落也必须修改: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Access control information --&amp;gt;&lt;br /&gt;
      &amp;lt;aci&amp;gt;&lt;br /&gt;
        &amp;lt;!-- The usernames listed here will get access to all restricted&lt;br /&gt;
             functions, regardless of restrictions further down --&amp;gt;&lt;br /&gt;
        &amp;lt;acl type='all'&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;jabberd&amp;lt;/user&amp;gt;&lt;br /&gt;
        &amp;lt;/acl&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===创建管理员用户===&lt;br /&gt;
&lt;br /&gt;
管理员用户的设置位于 ''sm.xml'' 文件的 ''aci'' 段落 . 缺省的管理员用户为 ''admin@localhost'' . 为了让管理员用户能远程操作, 把 ''jid'' 改成一个你自己拥有的用户如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;acl type='all'&amp;gt;  &lt;br /&gt;
        &amp;lt;jid&amp;gt;admin@lsomedomain.com&amp;lt;/jid&amp;gt;&lt;br /&gt;
      &amp;lt;/acl&amp;gt;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也可能需要从Jabber客户端手工来创建这个用户. 登录后, 该管理员用户将接收到用户创建的提示, 并且他也将能查询到所有在线用户, 接收帮助请求, 发送 MOTD (当日消息), 等等.&lt;br /&gt;
&lt;br /&gt;
注意以上用户被授权访问所有管理功能. 你可以通过指定 ''acl'' 类型来给用户赋予一些特定的管理权限. 参见 ''sm.xml'' 文件里的例子.&lt;br /&gt;
&lt;br /&gt;
重启你的 Jabberd 服务使得修改生效.&lt;br /&gt;
&lt;br /&gt;
===禁止公开注册===&lt;br /&gt;
&lt;br /&gt;
缺省情况下, Jabberd 允许所有用户公开注册, 也就是说能连上你的服务器的任何用户可以在你的服务器上创建他们自己的 Jabberd 用户. 为了阻止公开注册, 编辑 ''c2s.xml'' 配置文件.&lt;br /&gt;
&lt;br /&gt;
在 ''Authentication/registration database configuration'' 段落, 寻找 ''Registration configuration'' 子段落. 注释掉 ''enable'' 标签将禁止公开注册:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果配置使用了 '''PAM''' 或 '''OpenLDAP''' ，那么应该禁止公开注册, 因为 Jabberd 2 不支持通过 PAM 或 OpenLDAP 进行公开注册.&lt;br /&gt;
&lt;br /&gt;
===允许用户修改密码===&lt;br /&gt;
&lt;br /&gt;
在 Jabberd 2 里用户修改密码缺省是被禁止的. 为了允许你的用户修改他们自己的密码, 在 ''c2s.xml'' 文件中取消注释 ''authreg'' 段落里的 ''password'' 标签:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;!-- Authentication/registration database configuration --&amp;gt;&lt;br /&gt;
      &amp;lt;authreg&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Backend module to use --&amp;gt;&lt;br /&gt;
        &amp;lt;module&amp;gt;mysql&amp;lt;/module&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;!-- Registration configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;register&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Account registration is enabled by default (provided the&lt;br /&gt;
               auth/reg module in use supports it). Comment this out to&lt;br /&gt;
               disable. --&amp;gt;&lt;br /&gt;
          &amp;lt;enable/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Human-readable instructions to be returned to client when&lt;br /&gt;
               registration is requested. --&amp;gt;&lt;br /&gt;
          &amp;lt;instructions&amp;gt;Enter a username and password to register with this server.&amp;lt;/instructions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;!-- Password change only. When registration is disabled, it may&lt;br /&gt;
               still be useful to allow clients to change their password. If&lt;br /&gt;
               you want this, uncomment this when you disable registration. --&amp;gt;&lt;br /&gt;
          &amp;lt;password/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意当使用 PAM 或 OpenLDAP 验证的时候这个配置将不能生效，因为这些包不允许通过 Jabberd 修改密码. 重启你的 Jabberd 服务以使修改的配置生效.&lt;br /&gt;
&lt;br /&gt;
===设置DNS SRV记录===&lt;br /&gt;
&lt;br /&gt;
Jabberd 2, 以及其他Jabber客户端和服务器, 能够使用 DNS SRV 记录用户主机名解析. DNS SRV 记录允许服务 — 通过端口 — 委托给其他主机. 所以, 如果你希望你的Jabber服务器运行在一个非主要域主机的机器上, 你可能会愿意设置 DNS SRV 记录来委托Jabber客户端和服务器服务到另一个或多个主机.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: SRV 记录只对 非主要 主机是必要的'''&lt;br /&gt;
&lt;br /&gt;
:注意，只有你的Jabberd服务运行在一个和主要域主机不同的机器上并且你不希望在你的Jabber ID 里包含该主机(机器)的名称的时候，DNS SRV 记录才是必要的. 例如, 如果一个 DNS 查询 somedomain.com 解析到 host1.somedomain.com, 而你的 Jabberd 服务器运行在 host1, 那么 SRV 记录就不必要了.&lt;br /&gt;
&lt;br /&gt;
====Jabberd使用SRV记录====&lt;br /&gt;
&lt;br /&gt;
对于一个 Jabberd 安装，可以创建三个SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.&amp;lt;domain&amp;gt;   -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269&lt;br /&gt;
        _xmpp-server._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5269 &lt;br /&gt;
        _xmpp-client._tcp.&amp;lt;domain&amp;gt;    -&amp;gt;    &amp;lt;host&amp;gt;.&amp;lt;domain&amp;gt;:5222      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第一和第二个记录指定用于服务器间(s2s)通讯的主机和端口. 之所以有两个记录，是因为新的XMPP协议, 对于SRV记录, 已经取代了旧的Jabber标准. 第三个记录指定用于不加密的客户端(c2s)通讯的主机和端口.&lt;br /&gt;
&lt;br /&gt;
====在 [http://www.isc.org/products/BIND/ Bind] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
以下例子是在 BIND 服务器创建一组SRV记录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        _jabber._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-server._tcp.some_domain.com. 86400 IN SRV 5 0 5269 host.some_domain.com.&lt;br /&gt;
        _xmpp-client._tcp.some_domain.com. 86400 IN SRV 5 0 5222 host.some_domain.com.       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''some_domain.com'' 替换成你的域名，把主机的名字换成你的主机名, 并且不要忘记在域名后面的那个 &amp;quot;.&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
====在 [http://cr.yp.to/djbdns/tinydns.html TinyDNS] 里创建SRV记录====&lt;br /&gt;
&lt;br /&gt;
TinyDNS没有SRV记录格式; 然而, 你可以使用 Rob Mayoff 的 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 来创建 TinyDNS SRV 记录. 这些 TinyDNS SRV 记录被创建用于主机 host.some_domain.com ，使用优先级为 10 以及 权重为 '0':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
            :_jabber._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-client._tcp.some_domain.com:33:\000\012\000\000\024\146\004host\013some_domain\003com\000 &lt;br /&gt;
            :_xmpp-server._tcp.some_domain.com:33:\000\012\000\000\024\225\004host\013some_domain\003com\000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 [http://dqd.com/~mayoff/tools/djbdns/make-record.adp TinyDNS Record Maker] 创建一组记录加入到 TinyDNS 数据文件中.&lt;br /&gt;
&lt;br /&gt;
====测试SRV记录====&lt;br /&gt;
&lt;br /&gt;
一旦你的DNS服务器正确地更新之后, 你应该使用Dig测试列出的那些srv. 例如, 为了测试条目 _jabber._tcp.some_domain.com, 使用DNS服务器 my.dns_server.com, 你可以键入以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        dig @my.dns_server.com _jabber._tcp.some_domain.com any +short&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从你的DNS SRV记录查询得到的结果应该如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        10 0 5269 host.some_domain.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===使用Jabberd 1.4连接外部服务===&lt;br /&gt;
&lt;br /&gt;
本章描述如何使用一个现有的 Jabberd 1.4 服务器连接外部Jabberd 1.4服务, 例如网关和代理, 到Jabberd 2. 参见下一章,使用 JCR 组件连接外部服务. 参见 [[Jabberd2:安装和管理指南#附录|附录11]] 初步了解Jabberd 2如何使用Jabberd 1.4x进程来运行一个代理.&lt;br /&gt;
&lt;br /&gt;
这里假定读者已经很熟悉 Jabberd 1.4. , 也就是一个正在使用中的 Jabberd 1.4 安装. Jabberd 1.4 的安装和配置超出了本文的范围; 不过, 对此已经有很多好的资源存在, 包括 [http://news.gmane.org/gmane.network.jabber.admin Jadmin Archive] 和 [http://jabberd.jabberstudio.org/1.4/doc/adminguide Jabberd 1.4x管理指南] .&lt;br /&gt;
&lt;br /&gt;
把Jabberd连接到一个外部服务和把Jabberd 1.4连接到服务很相似; 不过从Jabberd 2连接到一个Jabberd 1.4服务有很多重要的不同: &lt;br /&gt;
&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#XDB段落|XDB段落]]&lt;br /&gt;
* 连接配置文件必须有一个 [[Jabberd2:安装和管理指南#Log段落|Log段落]]&lt;br /&gt;
* 连接配置文件必须指定 [[Jabberd2:安装和管理指南#Router的IP地址和端口|Router的IP地址和端口]]&lt;br /&gt;
* 连接配置文件和router配置文件必须共享一个密码&lt;br /&gt;
* router.xml文件必须包含一个 [[Jabberd2:安装和管理指南#Router别名|服务的别名]]&lt;br /&gt;
&lt;br /&gt;
另外,如果组件不支持查询( ''disco'' ),  ''sm.xml'' 里面应该有服务的名字空间. 例如, MU Conference 支持查询, 所以不需要在 ''sm.xml'' 配置它的条目以使该服务能够被浏览. 另一方面, JUD (Jabber用户目录)不支持查询; 所以, 需要在 ''sm.xml'' 里配置它的条目以使 JUD 可以被用户浏览到. 参见 ''sm.xml''  例子.&lt;br /&gt;
&lt;br /&gt;
下面的子段落描述了如何配置一个David Sutton为Jabberd 1.4 写的 MU Conference , 包括一个运行中的 MU Conference 的配置文件. 去 [http://www.jabberstudio.org/projects/mu-conference/project/view.php MU Conference] 获得下载以及更多关于这个组件的信息. MU Conference 为Jabberd提供了一个多用户聊天室服务.&lt;br /&gt;
&lt;br /&gt;
====XDB段落====&lt;br /&gt;
&lt;br /&gt;
运行一个Jabberd 1.4的网关或代理时, 主Jabberd进程处理XDB和logging函数. 运行Jabberd 2组件时不是这样. 反之, 组件应该运行在它自己的进程里, 并且组件应该自己处理它本身的XDB和logging函数. 也就是说外部组件应该运行在一个自包含的进程中. 但是, 如果你有一个用于连接Jabberd 1.4服务器的外部组件, 你应该添加一个 ''XDB'' 段落到该服务的配置文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;load&amp;gt;&lt;br /&gt;
            &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
        &amp;lt;/xdb&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上 ''XDB'' 段落指定了 hostname, 装载的XDB模块, 以及写spool的文件位置.&lt;br /&gt;
&lt;br /&gt;
====Log段落====&lt;br /&gt;
&lt;br /&gt;
如上所示, 组件配置文件也必须包含一个日志段落. 你可以为你连接的组件添加一个段落到配置文件，如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
          &amp;lt;host/&amp;gt;&lt;br /&gt;
          &amp;lt;logtype/&amp;gt;&lt;br /&gt;
          &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
        &amp;lt;/log&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里是一个 MU Conference 网关, 我已经在上面指定日志为 muc.log. 每个服务应该有一个独立的日志文件.&lt;br /&gt;
&lt;br /&gt;
====Router的IP地址和端口====&lt;br /&gt;
&lt;br /&gt;
连接的组件应该指定 ''router'' 监听的IP地址和端口. ''router'' 的缺省端口是 '''5347''' , 所以相关配置文件的 id 段落的开头应该类似这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====共享密码====&lt;br /&gt;
&lt;br /&gt;
Jabberd 2 服务器为每个组件连接使用一个密码. 这个密码类似Jabberd 1.4里的共享密码. 继续上述例子, 你应该为你使用的外部组件创建一个密码. (在 Jabberd 2里, 所有外部组件共享和 ''router'' 相同的密码) 这个密码, 或者 ''secret'' , 必须在你的连接组件的配置文件中指定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;uplink/&amp;gt;&lt;br /&gt;
          &amp;lt;connect&amp;gt;&lt;br /&gt;
            &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
            &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
            &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
          &amp;lt;/connect&amp;gt;&lt;br /&gt;
        &amp;lt;/service&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个 ''secret'' 也必须在你的 ''router.xml'' 文件中指定. 该 ''secret'' 应该在标为 'local network configuration' 的位置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Local network configuration --&amp;gt;&lt;br /&gt;
        &amp;lt;local&amp;gt;&lt;br /&gt;
          &amp;lt;!-- IP address to bind to (default: 0.0.0.0) --&amp;gt;&lt;br /&gt;
          &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Port to bind to (default: 5347) --&amp;gt;&lt;br /&gt;
          &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
          &amp;lt;!-- File containing the user table. This is where the router gets&lt;br /&gt;
               its component and secret information from for component&lt;br /&gt;
               authentication.--&amp;gt;&lt;br /&gt;
          &amp;lt;users&amp;gt;/usr/local/etc/jabberd/router-users.xml&amp;lt;/users&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Shared secret used to identify legacy components (that is,&lt;br /&gt;
               &amp;quot;jabber:component:accept&amp;quot; components that authenticate using&lt;br /&gt;
               the &amp;quot;handshake&amp;quot; method). If this is commented out, support for&lt;br /&gt;
               legacy components will be disabled. --&amp;gt;&lt;br /&gt;
          &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Router别名====&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件也必须包含用于连接的组件的别名, 而且 ''router.xml'' 文件提供了一个连接到MSN代理的例子. 为你连接的组件添加一个别名. 继续上面的例子, 这个别名将在 'router.xml' 文件中设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Name aliases.&lt;br /&gt;
&lt;br /&gt;
             Packets destined for the domain specified in the &amp;quot;name&amp;quot; attribute&lt;br /&gt;
             will be routed to the component that has currently bound the name&lt;br /&gt;
             in the &amp;quot;target&amp;quot; attribute (assuming it is online).&lt;br /&gt;
&lt;br /&gt;
             This is usually only required for some kinds of legacy&lt;br /&gt;
             components (particularly jabberd 1.4 &amp;quot;uplink&amp;quot; components) --&amp;gt;&lt;br /&gt;
        &amp;lt;aliases&amp;gt;&lt;br /&gt;
          &amp;lt;!-- Example for a msn transport running from a jabberd 1.4 uplink --&amp;gt;&lt;br /&gt;
          &amp;lt;!--&lt;br /&gt;
          &amp;lt;alias name='msn.domain.com' target='msn-linker'/&amp;gt;&lt;br /&gt;
          --&amp;gt;&lt;br /&gt;
          &amp;lt;alias name='conference.somedomain.com' target='muclinker'/&amp;gt;&lt;br /&gt;
        &amp;lt;/aliases&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意别名参考了组件的DNS解析名, 并且 ''target'' 参考了连接组件的XML文件中的 ''service id'' (参见 [[Jabberd2:安装和管理指南#共享密码|5.5.4]]).&lt;br /&gt;
&lt;br /&gt;
====例子:muc.xml====&lt;br /&gt;
&lt;br /&gt;
下面是一个运行中的 ''muc.xml'' 文件，用于 MU Conferencing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jabber&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;muclinker&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;uplink/&amp;gt;&lt;br /&gt;
            &amp;lt;connect&amp;gt;&lt;br /&gt;
              &amp;lt;ip&amp;gt;192.168.0.2&amp;lt;/ip&amp;gt; &amp;lt;!-- IP Address of Router here --&amp;gt;&lt;br /&gt;
              &amp;lt;port&amp;gt;5347&amp;lt;/port&amp;gt;&lt;br /&gt;
              &amp;lt;secret&amp;gt;ComponentPass&amp;lt;/secret&amp;gt;&lt;br /&gt;
            &amp;lt;/connect&amp;gt;&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;service id=&amp;quot;conference.somedomain.com&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
               &amp;lt;conference&amp;gt;/usr/local/jabber/mu-conference/src/mu-conference.so&amp;lt;/conference&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;conference xmlns=&amp;quot;jabber:config:conference&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;public/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;vCard&amp;gt;&lt;br /&gt;
          &amp;lt;FN&amp;gt;Public Chatrooms&amp;lt;/FN&amp;gt;&lt;br /&gt;
          &amp;lt;DESC&amp;gt;This service is for public chatrooms.&amp;lt;/DESC&amp;gt;&lt;br /&gt;
              &amp;lt;/vCard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;history&amp;gt;50&amp;lt;/history&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;logdir&amp;gt;/usr/local/var/jabberd/log/muc/&amp;lt;/logdir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;sadmin&amp;gt;&lt;br /&gt;
          &amp;lt;user&amp;gt;admin@somedomain.com&amp;lt;/user&amp;gt;&lt;br /&gt;
              &amp;lt;/sadmin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;notice&amp;gt;&lt;br /&gt;
          &amp;lt;join&amp;gt;has become available&amp;lt;/join&amp;gt;&lt;br /&gt;
          &amp;lt;leave&amp;gt;has left&amp;lt;/leave&amp;gt;&lt;br /&gt;
          &amp;lt;rename&amp;gt;is now known as&amp;lt;/rename&amp;gt;&lt;br /&gt;
              &amp;lt;/notice&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;/conference&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;log id=&amp;quot;muclog&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;file&amp;gt;/usr/local/var/jabberd/log/muc.log&amp;lt;/file&amp;gt;&lt;br /&gt;
            &amp;lt;host/&amp;gt;&lt;br /&gt;
            &amp;lt;logtype/&amp;gt;&lt;br /&gt;
            &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
          &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;host&amp;gt;conference.somedomain.com&amp;lt;/host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;load&amp;gt;&lt;br /&gt;
              &amp;lt;xdb_file&amp;gt;/usr/local/jabber/xdb_file/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
            &amp;lt;/load&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;spool&amp;gt;/usr/local/var/spool/jabber&amp;lt;/spool&amp;gt;&lt;br /&gt;
            &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
          &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/jabber&amp;gt;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C 检查点: 测试你的外部组件'''&lt;br /&gt;
&lt;br /&gt;
:一旦你的外部组件安装好了, 你应该启动这个组件，在一个Jabberd 1.4进程中运行它，使用类似下面的命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
          /usr/local/jabber/jabberd/jabberd -c /etc/jabber/muc.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''-c'' 参数为Jabberd 1.4指定一个配置文件. 在重启你的Jabberd 2服务器之后, 你的新的(外部)服务应该已经运行了. 在这个 MU Conference 的例子中, 你应该能通过一个兼容客户端来配置多用户聊天室了, 或通过包含在tarball里的脚本也可以配置.&lt;br /&gt;
&lt;br /&gt;
===使用JCR作为Jabberd 2组件===&lt;br /&gt;
&lt;br /&gt;
因为Jabberd 2服务器比较新, 只有很少的组件是特别为Jabberd 2服务器开发的. 然而, Paul Curtis 写了一个组件封装器 [http://jabber.terrapin.com/JCR/ Jabber Component Runtime] ，可作为Jabberd 2服务的外部组件来运行. Jabber Runtime Component (JCR) 允许用C语言写的Jabberd 1.4组件运行于独立进程来连接到Jabberd 2. 在撰写本文的时候, 只有 MU Conference 和 Yahoo! transport 通过了 JCR 封装测试.JCR如何与Jabberd 2整合，参见 [[Jabberd2:安装和管理指南#Jabberd 2代理入门|附录11]] .&lt;br /&gt;
&lt;br /&gt;
JCR封装器会生成一个二进制文件来运行代理或服务. 实际上, 这个二进制文件提供的所有服务就是一个独立的用于代理或服务的Jabberd 1.4x进程. JCR包的INSTALL文件提供了使用说明, 而且也可以在 [http://mu-conference.jabberstudio.org/ MU Conference] 网站找到好用的说明.&lt;br /&gt;
&lt;br /&gt;
以下是一个例子，为MU Conference服务创建一个JCR的二进制文件的步骤:&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#下载JCR和MU Conference|下载JCR和MU Conference]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译JCR库|编译JCR库]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#编译组件|编译组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#配置组件|配置组件]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动组件|启动组件]]&lt;br /&gt;
&lt;br /&gt;
撰写本文的时候, JCR 0.2.4 和 MU Conference 0.6.0 是最新版本并用于本示例.&lt;br /&gt;
&lt;br /&gt;
====下载JCR和MU Conference====&lt;br /&gt;
&lt;br /&gt;
从 [http://jabber.terrapin.com/JCR JCR主页] 下载最新的JCR包, 从 [http://mu-conference.jabberstudio.org/ MU Conference主页] 下载最新的MU Conference包，放到工作目录. 然后解压JCR包:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -xzvf jcr-0.2.4.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JCR依赖于 ''glib-2.0'' . 在编译JCR库之前，你应该检查你的系统里是否已经装了它.&lt;br /&gt;
&lt;br /&gt;
====编译JCR库====&lt;br /&gt;
&lt;br /&gt;
进入JCR目录之后编译JCR库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd jcr-0.2.4&lt;br /&gt;
        make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我和其他人注意到编译过程出现了一些以 ''TERROR_'' 开头的错误. 这些错误不影响正常使用JCR.&lt;br /&gt;
&lt;br /&gt;
====编译组件====&lt;br /&gt;
&lt;br /&gt;
移动服务包(在这里是 ''mu-conference-0.6.0.tar.gz'' ), 到JCR目录(在这里是 ''jcr-0.2.4'' ), 然后把服务包解压到那里:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mv ../mu-conference-0.6.0.tar.gz ./&lt;br /&gt;
        tar -xzvf mu-conference-0.6.0.tar.gz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
拷贝JCR库文件( ''main.c'' 和 ''jcomp.mk'' ) 到服务的 ''src'' 目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cp src/main.c mu-conference-0.6.0/src/&lt;br /&gt;
        cp src/jcomp.mk mu-conference-0.6.0/src/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后 ''cd'' 到服务的 ''src'' 目录并编译JCR组件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cd mu-conference-0.6.0/src/&lt;br /&gt;
        make -f jcomp.mk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译过程应该会产生一个名为 ''mu-conference'' 的二进制文件(在 ''mu-conference/src/'' 目录). 这个二进制文件为Jabberd 2提供MU Conference服务. 拷贝这个二进制文件到一个bin目录, 例如 ''/usr/local/bin'' .&lt;br /&gt;
&lt;br /&gt;
====配置组件====&lt;br /&gt;
&lt;br /&gt;
JCR包的 ''src'' 目录包含一个示例配置文件( ''muc_conf.xml'' ) 用于MU Conference. 拷贝这个文件到你的Jabberd 2配置文件所在的目录, 例如 ''/etc/jabberd'' 或 ''/usr/local/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
为你自己的安装编辑 ''muc_conf.xml'' . 在 ''muc_conf.xml'' 里, 设置用于 ''spool'' , ''logdir'' (有两个log目录) 和 ''pidfile'' 的目录. 它们应该被设置到你的jabber用户有足够权限的目录. (注意 ''spool'' 参照spool ''目录'' .) 把 ''host'' 设置成一个你的客户端可以解析的名称. 把 ''ip'' 设置成你的Jabberd服务器的IP地址或主机名. 设置 ''secret'' 要符合你的 ''router.xml'' 文件中用来标识外部组件的 ''secret'' (位于 ''local'' 段落). 你也可以设置一个管理员JID( ''sadmin'' ).&lt;br /&gt;
&lt;br /&gt;
编辑你的 ''router.xml'' 文件来为这个服务提供一个别名. 在 ''Name aliases'' 段落,添加一个alias标识这个服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;alias name='conference.somedomain.com' target='linker'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 ''mu_conf.xml'' 文件中 ''conference.somedomain.com'' 作为 ''host'' , ''linker'' 作为 ''name'' .&lt;br /&gt;
&lt;br /&gt;
====启动组件====&lt;br /&gt;
&lt;br /&gt;
重启你的Jabberd 2服务器使得修改生效, 然后启动 ''mu-conference'' 执行文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/mu-conference -c /etc/jabberd/muc-conf.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你的Jabber用户现在应该能浏览到 Public Chatrooms 服务, 而且他们应该能创建和使用群聊天室. ''mu-conference'' 执行文件启动的时候不会从终端断开. 你可能要使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来让 ''mu-conference'' 开机启动.&lt;br /&gt;
&lt;br /&gt;
===安装一个使用Users-Agent的JUD===&lt;br /&gt;
&lt;br /&gt;
Ryan Eatmon已经更新了他的 Users-Agent JUD (Jabber用户目录)包来兼容Jabberd 2, 并且获得来自John Hamill的一些有价值的帮助之后, 我能让它和我的Jabberd 2安装一起跑了. Users-Agent是一个基于Perl的JUD，使用MySQL做数据存储. Jabber.org目前使用Users-Agent作为JUD.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: JUD和vCard数据不是一回事'''&lt;br /&gt;
&lt;br /&gt;
:JUD提供给用户一个可搜索的数据库，他们可以从这找到联系人. JUD不是一个vCard数据的数据库. vCard数据是独立于JUD数据库的, 所以你不应该期望安装好的JUD包含现有的vCard数据. 反之, 用户必须通过注册来给JUD提供数据.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: Fljud提供了LDAP和JUD的集成'''&lt;br /&gt;
&lt;br /&gt;
:如果你正使用OpenLDAP作为验证系统, 你可能想看看 [http://binary-ape.sourceforge.net/ Fljud] 产品. Fljud集成了JUD和LDAP数据.&lt;br /&gt;
&lt;br /&gt;
我已经记录了获取和运行Users-Agent的步骤; 然而, 我很有兴趣知道别人是怎么干的. 一个运行中的Users-Agent包包括三个元素:&lt;br /&gt;
&lt;br /&gt;
* ''users-agent'' (Perl脚本)&lt;br /&gt;
* ''config.xml'' (配置文件)&lt;br /&gt;
* ''JUD'' (MySQL数据库)&lt;br /&gt;
&lt;br /&gt;
''users-agent'' 脚本是运行程序，它提供JUD服务. ''users-agent'' 脚本依赖于 ''config.xml'' 文件的配置. ''config.xml'' 文件必须和 ''users-agent'' 运行文件处于同一个目录 — 或者运行时使用 ''-c'' 选项指定 ''config-xml'' 的位置. ''users-agent'' 把所有数据存储在一个 MySQL数据库 ''JUD'' 里面. 这个包带了一个脚本 ''createDB'' ,用来安装 ''JUD'' 数据库.&lt;br /&gt;
&lt;br /&gt;
Users-Agent的安装包括7个步骤, 细节如下:&lt;br /&gt;
&lt;br /&gt;
#[[Jabberd2:安装和管理指南#安装必需的Perl模块|安装必需的Perl模块]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#下载并安装Users-Agent|下载并安装Users-Agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#创建JUD数据库|创建JUD数据库]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置JUD数据库授权|设置JUD数据库授权]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#配置config.xml|配置config.xml]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#测试users-agent|测试users-agent]]&lt;br /&gt;
#[[Jabberd2:安装和管理指南#设置Users-Agent伴随Jabberd 2启动|设置Users-Agent伴随Jabberd 2启动]]&lt;br /&gt;
&lt;br /&gt;
这些步骤可能看起来很复杂; 然而, 安装是相当直接的, 并且我已经尝试提供尽可能多的细节.&lt;br /&gt;
&lt;br /&gt;
====安装必需的Perl模块====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于以下三个Perl模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        Net::Jabber v1.30&lt;br /&gt;
        XML::Stream v1.18&lt;br /&gt;
        DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更多关于这些模块的信息, 参见 [http://www.cpan.org/ CPAN] 网站. 安装它们(包括任何依赖)的最简单的办法是使用Perl的 [http://search.cpan.org/~andk/CPAN-1.76/lib/CPAN.pm CPAN.pm] 安装工具. 要安装这些Perl模块, 运行以下指令(以超级用户身份)进入 ''cpan'' shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        perl -MCPAN -e shell&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果这是你第一次使用 ''cpan'' shell, 你将进入一个交互安装脚本. 一旦完成, 你就可以安装上述的包了(此时仍在 ''cpan'' shell环境):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        cpan&amp;gt; install Net::Jabber&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install XML::Stream&lt;br /&gt;
&lt;br /&gt;
        cpan&amp;gt; install DBI&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些安装完成之后, 你才可以安装Users-Agent. 如果你需要安装其他Perl模块, 你可以使用这个命令( ''perl -MCPAN -e shell'' )进入 ''cpan'' shell .&lt;br /&gt;
&lt;br /&gt;
====下载并安装Users-Agent====&lt;br /&gt;
&lt;br /&gt;
选择一个目录来安装Users-Agent. 在以下例子中, User-Agent安装在 ''/etc/jabberd'' .&lt;br /&gt;
&lt;br /&gt;
从你选择的目录, 从 [http://www.jabberstudio.org/ Jabberstudio.org] 下载最新版本的 [http://www.jabberstudio.org/projects/users-agent/releases/ Users-Agent] 包 . 下面例子的版本是 Users-Agent 1.1.&lt;br /&gt;
&lt;br /&gt;
解压Users-Agent包, 然后切换到刚建的目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        tar -zxvf users-agent-1.1.tar.gz&lt;br /&gt;
        cd users-agent-1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent装好了.&lt;br /&gt;
&lt;br /&gt;
====创建JUD数据库====&lt;br /&gt;
&lt;br /&gt;
Users-Agent包自带了一个 ''createDB'' 脚本用来创建 MySQL ''JUD'' 数据库. 这个脚本需要对现有的 MySQL 数据库的临时访问权以连接到MySQL并安装 ''JUD'' 数据库. 最简单的办法就是临时把你的 MySQL root 密码清空，命令如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root -p password &amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
另一个办法是, 你可以编辑 ''createDB'' 脚本的第13行和第17行，那里有你的 MySQL root 密码 (在引号之间输入密码). 然而, 如果你不禁用你的MySQL root密码, 你必须在运行 ''createDB'' 之前 export ''DBI_DRIVER'' 环境变量 . ''DBI_DRIVER'' 变量应该被设成 ''dbi:mysql:test:localhost'' , 这里 ''test'' 指的是一个运行中的MySQL数据库.&lt;br /&gt;
&lt;br /&gt;
一旦你禁用你的MySQL root密码(或编辑了 ''createDB'' 并设置了 ''DBI_DRIVER'' 变量), 运行这个脚本来创建你的 ''JUD'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        ./createDB&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在你创建数据库之后, 你应该重置你的MySQL root密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysqladmin -u root password &amp;quot;oldrootpassword&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后, 你可以进入mysql console检查这个数据库:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; show databases;&lt;br /&gt;
        +----------+&lt;br /&gt;
        | Database |&lt;br /&gt;
        +----------+&lt;br /&gt;
        | JUD      |&lt;br /&gt;
        | jabberd2 |&lt;br /&gt;
        | mysql    |&lt;br /&gt;
        | test     |&lt;br /&gt;
        +----------+&lt;br /&gt;
        4 rows in set (0.00 sec)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在 ''JUD'' 数据库装好了.&lt;br /&gt;
&lt;br /&gt;
====设置JUD数据库授权====&lt;br /&gt;
&lt;br /&gt;
创建 ''JUD'' 数据库之后, 需要对它进行授权. 如果你使用MySQL来为Jabberd 2做验证或存储, 你已经有一个MySQL用户可以用于 ''JUD'' 数据库. 如果是这种情况, 进入MySQL控制台并运行这个SQL指令来授权MySQL用户jabberd2允许访问 ''JUD'' 数据库(如果你不是使用缺省的MySQL用户那么替换掉 ''jabberd2'' ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost' WITH GRANT OPTION;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你的Jabberd 2正在使用MySQL但是不记得你的MySQL用户名, 打开 ''sm.xml'' 或 ''c2s.xml'' 并扫描以下段落 ''MySQL driver configuration'' , 那里可以找到连接Jabberd 2的 ''user'' 和密码( ''pass'' ) .&lt;br /&gt;
&lt;br /&gt;
如果你没有使用MySQL来验证或者存储, 你应该运行一个稍微不同的SQL指令来创建一个新的MySQL用户以及密码，''users-agent'' 将用它来连接MySQL(把 ''secret_password'' 替换成你打算用来连接MySQL的用户的密码):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'jabberd2'@'localhost'&lt;br /&gt;
            -&amp;gt; IDENTIFIED BY 'secret_password' WITH GRANT OPTION;     &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完成授权之后, 你可以用你的jabberd2用户启动MySQL控制台来进行测试. 你的 ''jabberd2'' 需要一个MySQL密码(如上创建一个密码或在 ''sm.xml'' 找到密码) to start the console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&lt;br /&gt;
        mysql&amp;gt; use JUD;&lt;br /&gt;
        mysql&amp;gt; select * from jud;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你应该接收到类似这样的输出: ''Empty set (0.01 sec)'' . 你的 ''JUD'' 数据库现在准备好让 ''users-agent'' 使用了.&lt;br /&gt;
&lt;br /&gt;
====配置config.xml====&lt;br /&gt;
&lt;br /&gt;
Users-Agent依赖于 ''config.xml'' 用于配置. 在一个文本编辑器打开 ''config.xml'' . 为了让Users-Agent运行, 我编辑了以下6个标签的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;hostname&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;&lt;br /&gt;
        &amp;lt;secret&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;&lt;br /&gt;
        &amp;lt;username&amp;gt;&lt;br /&gt;
        &amp;lt;password&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#编辑 ''hostname'' 值，为你的Jabberd 2服务器提供主机名. 它应该和 ''sm.xml'' 文件中的 ''id'' 相同.&lt;br /&gt;
#编辑 ''port to'' 提供Jabberd 2 router监听的端口号. 缺省是 ''5347'' .&lt;br /&gt;
#编辑 ''secret'' 来提供Jabberd 2 router用来连接外部组件的共享 ''secret'' . 你正在使用的这个共享 ''secret'' 可以在 ''router.xml'' 文件顶部附近找到. 在标为 ''Local Network configuration'' 的段落查找 ''secret'' 标签.&lt;br /&gt;
#编辑 ''name'' 来提供 ''Users-Agent'' 使用的主机名. 这个主机名类似 ''users.somedomain.com'' , ''users.jabber.somedomain.com'' , ''jud.somedomain.com'' , 等等. 如果你的客户端要从互联网访问它，那么这个主机名必须是可以被DNS解析的.&lt;br /&gt;
#编辑 ''username'' 来提供MySQL用户(参见 5.10.4.). 对于缺省安装来说, 这个 ''username'' 就是 ''jabberd2'' .&lt;br /&gt;
#编辑 ''password'' 来提供MySQL用户的密码(参见 5.10.4.). 再一次的,这个 ''password'' 可以在 ''sm.xml'' 或 ''c2s.xml'' 里找到如果你已经在Jabberd 2里使用了MySQL.&lt;br /&gt;
&lt;br /&gt;
现在 ''users-agent'' 配置好了可以用了.&lt;br /&gt;
&lt;br /&gt;
====测试users-agent====&lt;br /&gt;
&lt;br /&gt;
现在你应该启动并测试 ''users-agent'' . 确保你的Jabberd 2和MySQL服务器正在运行. 然后, 启动 ''users-agent'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber      &lt;br /&gt;
        ./users-agent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Users-Agent应该无错误的启动, 并且它不会退出. Users-Agent不会把自己推到后台运行, 所以它应该保持运行在终端里.&lt;br /&gt;
&lt;br /&gt;
从你的Jabberd客户端登录到你的服务器. 随着 ''users-agent'' 的运行, 你应该能看到一个可用的服务 ''Users-Agent'' . 你的客户端如何显示它依赖于客户端的类型. 这个 ''Users-Agent'' 服务应该提供 ''Register'' 和 ''Search'' 选项.&lt;br /&gt;
&lt;br /&gt;
你的 ''JUD'' 数据库是空的, 所以你需要注册一些用户来测试它. 从你的Jabber客户端, 选择 ''Register'' (在Jabebrd客户端这通常是右键点击选项). 你应该看到这个服务的注册选项，包括一个表单让你输入个人信息.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 客户端的选择会影响代理的使用'''&lt;br /&gt;
&lt;br /&gt;
:测试期间, 我不是总能通过测试客户端来获得Users-Agent. 在Linux下, PSI看起来反应良好; 然而, 用户初次尝试注册的时候PSI不显示注册表单. 用户必须注册一次然后再次注册来添加任何数据. 在Windows下, JAJC和Exodus表现良好; 然而, JAJC, 右击 ''Users-Agent'' 时不提供 ''register'' 和 ''search'' 选项. 在JAJC选择 ''Discovery (info)'' 无法提供信息. Exodus是我测试过的所有客户端(PSI, Gabber, Gnome-Gabber, Kopete, Exodus, JAJC 和 Neos)中表现最好的.&lt;br /&gt;
&lt;br /&gt;
现在, 你应该能准确搜索Users-Agent. 从你的客户端, 返回这个服务并选择 ''Search'' . 你应该看到一个搜索表单.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: Users-Agent支持局部匹配'''&lt;br /&gt;
&lt;br /&gt;
: ''Users-Agent'' 支持局部匹配搜索. 不需要也不使用通配符.&lt;br /&gt;
&lt;br /&gt;
你应该能够通过搜索注册表单中的任何字段的头一个字母搜索到刚才注册的用户.&lt;br /&gt;
&lt;br /&gt;
====设置Users-Agent伴随Jabberd 2启动====&lt;br /&gt;
&lt;br /&gt;
当你的Users-Agent配置好运行之后, 你可能希望把它添加到你的&amp;quot;app_rc.html脚本来伴随Jabberd 2启动和停止, 或者你可以选择使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来监控它.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 如果User-Agent无法连接Router就会挂掉'''&lt;br /&gt;
&lt;br /&gt;
:如果 ''users-agent'' 不能连接到 ''router'' 组件就会挂掉. 这意味着如果你的Jabberd 2服务器停止或挂掉, ''users-agent'' 将会挂掉并且需要重启. 你可能希望使用 [http://www.jabberdoc.org/app_dtools.html Daemon Tools] 来确保 ''users-agent'' 总是在它无法连接 ''router'' 时重启启动.&lt;br /&gt;
&lt;br /&gt;
===集成vCard数据到Users-Agent(仅限私有服务器)===&lt;br /&gt;
&lt;br /&gt;
我已经为Users-Agent写了一个补丁来让Jabberd 2 vCard数据成为Users-Agent的数据源. 应用它之后, Users-Agent使用Jabberd vCard表来搜索和注册. 也就是说, 用户更新他们自己的vCards会被反应到Users-Agent JUD搜索结果里. 用户可以使用常规方法更新他们的vCard数据, 他们也可以通过Users-Agent注册流程来更新Users-Agent字段 (first name, last name, nickname 和 email).&lt;br /&gt;
&lt;br /&gt;
'''I 重要: JUD和vCard数据不应该(SHOULD NOT)被集成到公共服务器中'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁仅仅用于私有服务器. 在公共服务器, 用户对vCards如何展示个人信息拥有完全的控制. 一个用户可以通过验证那个用户来允许另一个用户显示个人vCard数据，也可以手工注册到JUD. &lt;br /&gt;
&lt;br /&gt;
这个补丁仅用于私有的Jabberd 2服务器, 这些可以用于公司或教育机构. 对它们来说, 经常需要让每个用户很方便的搜索到全部用户列表. 注意, 无论如何, 即时本补丁应用之后, 每个用户也必须创建一个vCard条目才能在Users-Agent JUD里可见.&lt;br /&gt;
&lt;br /&gt;
'''I 重要: 补丁未进行高负载的测试'''&lt;br /&gt;
&lt;br /&gt;
:这个补丁还未进行经过压力测试. &lt;br /&gt;
&lt;br /&gt;
为了应用本补丁, 首先让Users-Agent跑起来，参见 5.10. 然后, 下载 [http://www.jabberdoc.org/tools/users-agent.vcard.patch users-agent.vcard.patch] 到你的 ''users-agent'' 文件安装的目录. 使用以下指令应用这个补丁:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
      patch -p0 &amp;lt; users-agent.vcard.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编辑 ''config.xml'' 把 ''dbname'' 设为你的Jabberd 2 MySQL数据库(通常是 ''jabberd2  ). 如果必要也编辑 ''username'' 和 ''password'' . 重启 ''users-agent'' , 现在它应该连接到Jabberd 2 vCard数据了.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section05/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==常规管理任务==&lt;br /&gt;
&lt;br /&gt;
本章尝试为日复一日的Jabberd管理任务，包括用户管理，提供一个指南.&lt;br /&gt;
&lt;br /&gt;
* [[Jabberd2:安装和管理指南#启动和停止Jabberd 2|启动和停止Jabberd 2]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#从Jabberd 1.4迁移|从Jabberd 1.4迁移]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#添加用户|添加用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#删除用户|删除用户]]&lt;br /&gt;
* [[Jabberd2:安装和管理指南#发送MOTD和消息给所有在线用户|发送MOTD和消息给所有在线用户]]&lt;br /&gt;
&lt;br /&gt;
详细的配置信息在下一章.&lt;br /&gt;
&lt;br /&gt;
===启动和停止Jabberd 2===&lt;br /&gt;
&lt;br /&gt;
本节描述如何启动和停止Jabberd 2执行文件. 以RC脚本来运行Jabberd 2，参见 [[Jabberd2:安装和管理指南#附录|附录7]] 或使用Daemontools来运行Jabberd 2,参见 [[Jabberd2:安装和管理指南#附录|附录8]] .&lt;br /&gt;
&lt;br /&gt;
====启动Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
''jabberd'' 启动脚本启动Jabberd 2服务. 这个脚本被安装在Jabberd 2二进制文件的同一个目录下(缺省为 ''/usr/local/jabberd'' ).  要启动这个服务器, 切换到 ''jabber'' 用户然后运行启动脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        su jabber&lt;br /&gt;
        /usr/local/bin/jabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个脚本包含了五个Jabberd 2执行文件的启动. 这个脚本为每个Jabberd 2执行文件指定了相关的配置文件(缺省位于 ''/usr/local/etc/jabberd'' ).&lt;br /&gt;
&lt;br /&gt;
====停止Jabberd 2====&lt;br /&gt;
&lt;br /&gt;
目前Jabberd 2没有停止脚本; 所以必须手工杀死5个Jabberd 2进程来停止服务器. 为了停止服务器, 要杀死以下进程(以root或jabber用户身份都可以):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
        router&lt;br /&gt;
        resolver&lt;br /&gt;
        sm&lt;br /&gt;
        c2s&lt;br /&gt;
        s2s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止以上进程中的一个可能导致另一个挂掉; 然而, 重要的是在尝试重启之前必须确保所有Jabberd 2进程已经杀死. 单个运行的进程可能会导致服务器无法重启.&lt;br /&gt;
&lt;br /&gt;
===从Jabberd 1.4迁移===&lt;br /&gt;
&lt;br /&gt;
Robert Norris, Jabberd的主要开发者, 已经创建了一个Perl脚本把Jabberd 1.4数据迁移到MySQL或PostgreSQL. 特别要注意, 这个脚本只迁移验证信息和好友列表. [http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 脚本目前可以从jabberstudio.org的CVS获得; 不过, 下一个版本的Jabberd 2会带上它.&lt;br /&gt;
&lt;br /&gt;
基本上, 这个脚本像一个服务一样工作，连接到一个现有的Jabberd 1.4安装, 然后导出到一个现有的Jabberd 2数据库. 它有很多依赖(在脚本里列出来了):&lt;br /&gt;
&lt;br /&gt;
* XML::Stream 1.17 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Net::Jabber 1.29 或更高版本 (来自 JabberStudio)&lt;br /&gt;
* Digest::SHA1&lt;br /&gt;
* DBI&lt;br /&gt;
* DBD::Pg 或 DBD::mysql&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jabberd2/tools/migrate.pl#dirlist migrate.pl] 文件包含完整的使用说明.&lt;br /&gt;
&lt;br /&gt;
===添加用户===&lt;br /&gt;
&lt;br /&gt;
在本文写就的时刻, 没有脚本用来添加用户; 然而, 用户可以很容易的加入到一个MySQL或PostgreSQL数据库. 本章描述如何添加一个用户到一个MySQL数据库. 天极一个用户到PostgreSQL, 也是类似的. 本章假设已经禁止了公开注册(参见 [[Jabberd2:安装和管理指南#禁止公开注册|5.5章]]).&lt;br /&gt;
&lt;br /&gt;
'''N 注意'''&lt;br /&gt;
&lt;br /&gt;
:Jabberd 2不支持从Berkeley DB验证存储来添加或删除用户的机制.&lt;br /&gt;
&lt;br /&gt;
====允许Auto-Create====&lt;br /&gt;
&lt;br /&gt;
在 ''sm.xml'' 的 ''user'' 段落包含了一个标签 ''auto-create'' , 允许这个标签可以使得一个用户在初次登录时被存储包自动创建(如果这个用户不存在于数据库中的话). 当这个标签被允许, 用户可以被手工添加到验证( ''authreg'' ) 数据库, 并且每个用户初次登录的时候, Jabberd将为那个用户创建好友列表, 模板, 等等. 特别注意的是, 当一个新的用户初次登录的时候, ''auto-create'' 标签会导致 ''user-create'' 链被调用.&lt;br /&gt;
&lt;br /&gt;
缺省Auto-create是禁用的. 为了激活它, 在 ''sm.xml'' 文件的  ''user'' 段落取消注释 ''auto-create'' 标签. 这个标签靠近 ''sm.xml'' 文件的结尾.&lt;br /&gt;
&lt;br /&gt;
====从MySQL控制台创建用户====&lt;br /&gt;
&lt;br /&gt;
现在 ''auto-create'' 激活了, 你可以从MySQL控制台创建一个用户.&lt;br /&gt;
&lt;br /&gt;
以Jabberd用户登录到MySQL控制台:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql -u jabberd2 -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 切换到 ''jabberd2'' 数据库:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; use jabberd2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从MySQL控制台, 插入一行到 ''authreg'' 表. 这一行应该包含 ''username'' , ''realm'' 和 ''password'' 的值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
        mysql&amp;gt; insert into authreg (username, realm, password)&lt;br /&gt;
            -&amp;gt; values ('myusername', 'somedomain.com', 'mypassword');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 ''somedomain.com'' 修改成符合你的配置的值. 大部分情况下, realm将会和Jabber服务器的ID相同. 把 ''myusername'' 和 ''mypassword'' 修改成你的新用户的名称和密码.&lt;br /&gt;
&lt;br /&gt;
你的新用户现在可以用Jabber客户端登录了.&lt;br /&gt;
&lt;br /&gt;
===删除用户===&lt;br /&gt;
&lt;br /&gt;
MySQL控制台也可以用来从一个MySQL验证数据库( ''authreg'' )删除用户. 输入这个命令来删除用户:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mysql&amp;gt; delete from authreg where username='the_user_name';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意从 ''authreg'' 表删除用户将不会删除其他的用户数据, 例如好友列表; 然而, 一旦该用户被从 ''authreg'' 删除, 这个用户将不再能登录到这个Jabberd服务器.&lt;br /&gt;
&lt;br /&gt;
===发送MOTD和消息给所有在线用户===&lt;br /&gt;
&lt;br /&gt;
发送MOTD's(当日消息)和消息给所有在线用户，必须从拥有广播权限的管理员账户来发. 如何授权参见 [[Jabberd2:安装和管理指南#创建管理员用户|5.4章]]. 一旦用户拥有广播的权限, 这些消息就可以从Jabber客户端来发送. 为你创建的管理员用户增加以下联系人:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      somedomain.com/announce&lt;br /&gt;
&lt;br /&gt;
      somedomain.com/announce/online&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
发送一个消息到 ''somedomain.com/announce'' 将会发送一个Jabber MOTD到这个域的所有用户. 离线用户将在下次登录的时候接收到消息. 发送一个消息到 ''somedomain.com/announce/online'' 将只向在线用户发送消息. 注意如果你的Jabber客户端不提供显式支持MOTD's, 你可以上述的JID添加一个联系人, 然后使用那个联系人发送MOTD's.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section06/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 文件提供 ''router'' 组件的配置, 它是Jabberd服务器的中枢. router组件接受从其他组件的连接, 然后在它们之间传递XML包. ''router.xml'' 文件包含了以下主要章节:&lt;br /&gt;
&lt;br /&gt;
*ID,PID和日志&lt;br /&gt;
*网络&lt;br /&gt;
*输入输出控制&lt;br /&gt;
*别名&lt;br /&gt;
*功能访问控制&lt;br /&gt;
&lt;br /&gt;
读者们可能都知道, Jabberd XML文件是自文档化的. 本章和子章节的配置段落仅尝试提供这些文件的结构概览以及一些文档本身未提到的小技巧.&lt;br /&gt;
&lt;br /&gt;
===ID,PID和日志===&lt;br /&gt;
&lt;br /&gt;
''router.xml'' 最前面的三个子段落处理基本的后勤项目. 对于几乎所有的安装来说, ''id'' 段落应该保留缺省值( ''router'' ). ''pid'' 段落指定 ''router'' 组件在哪里写入它的进程ID. 如果你不需要从Jabberd外部读取进程ID, 你可以屏蔽掉这个段落. 例如, 如果你使用D.J. Bernstein的DaemonTools来运行Jabberd, 你可以注释掉 ''pid'' 段落.&lt;br /&gt;
&lt;br /&gt;
Jabberd日志缺省记录到 ''syslog'' . 如果你倾向于让 ''router'' 把日志写到它自己的日志文件, 把 ''log type'' 改为 ''file'' , 并指定日志所在位置.&lt;br /&gt;
&lt;br /&gt;
===网络===&lt;br /&gt;
&lt;br /&gt;
''local'' 子段落处理 ''router'' 的网络和连接设置. ''ip'' 和 ''port'' 标签指定网络设置.&lt;br /&gt;
&lt;br /&gt;
'''N 注意: 0.0.0.0 代表所有可用的IP'''&lt;br /&gt;
&lt;br /&gt;
:注意在所有这些Jabberd XML文件中, IP地址 ''0.0.0.0'' 表示这个组件应该监听所有可用的IP地址. ''0.0.0.0'' 是IP地址的缺省设置, 并且对大部分安装来说保留这个缺省值是不会错的.&lt;br /&gt;
&lt;br /&gt;
''users'' 标签指定包含用户ID和密码的文件，这些用户可以访问 ''router'' . 该文件的描述参见下一章.&lt;br /&gt;
&lt;br /&gt;
''secret'' 标签指定一个共享的安全码用于外部服务. 外部服务通过共享安全码来进行验证, 反之则通过 ''router-users.xml'' 文件中的用户列表来验证. ''secret'' 和Jabberd 1.4连接配置文件中的共享安全码是一样的作用. 参见 [[Jabberd2:安装和管理指南#使用Jabberd 1.4连接外部服务|5.8]] 和 [[Jabberd2:安装和管理指南#使用JCR作为Jabberd 2组件|5.9]] 中如何设置外部服务.&lt;br /&gt;
&lt;br /&gt;
''pemfile'' 位置指定证书文件和私钥的位置用于客户端通讯. 注意在这个例子里, 客户端值的是相对于 ''router'' 的客户端, 而不是最终用户的Jabber客户端. 换句话说, 这里的 ''pemfile'' 是用于其他Jabberd组件和 ''router'' 本身之间的安全通讯. 要了解更多在Jabberd中设置SSL的信息，参见 [[Jabberd2:安装和管理指南#配置Jabberd 2使用SSL连接|5.2]] 和 [[Jabberd2:安装和管理指南#附录|附录:生成自签名SSL密钥]] . 注释掉本段落会导致禁用Jabberd组件之间的SSL通讯.&lt;br /&gt;
&lt;br /&gt;
===输入输出控制===&lt;br /&gt;
&lt;br /&gt;
''i/o'' 段落控制以下的输入/输出选项:&lt;br /&gt;
&lt;br /&gt;
* 连接限制&lt;br /&gt;
* 频率限制&lt;br /&gt;
* IP访问控制&lt;br /&gt;
&lt;br /&gt;
注意这些段落的缺省设置应该对大部分安装是可用的.&lt;br /&gt;
&lt;br /&gt;
====连接限制====&lt;br /&gt;
&lt;br /&gt;
Jabberd通过 ''max_fds'' (最大文件句柄数)对连接数设置了一个限制. Jabberd对每一个连接使用一个文件句柄. 所以, 对router设置文件句柄的最大数量会影响Jabberd服务器的并发连接数限制. 如 ''router.xml'' 文件所说, ''router'' 本身可能使用最多4条连接(和其他Jabberd组件); 所以, 这里设置的最大文件句柄数量实际上比可能的并发连接数量稍微多一点点.&lt;br /&gt;
&lt;br /&gt;
====频率限制====&lt;br /&gt;
&lt;br /&gt;
''limits'' 段落规定单个连接的吞吐量. 本段落相当于Jabberd 1.4中的一个简化的karma设置. 缺省的 ''bytes'' 和 ''connects'' 都是0. 就是说, 这些限制缺省都是禁用的. 在重载的时候服务器管理员可能希望设置这个限制来组织用户过量使用服务器资源. ''router.xml'' 文件包含一个例子告诉我们如何对连接设置频率限制.&lt;br /&gt;
&lt;br /&gt;
====IP访问控制====&lt;br /&gt;
&lt;br /&gt;
''access'' 子段落指定IP地址应该被允许或禁止访问 ''router'' . 被禁止访问 ''router'' 的IP地址无法让它们的包被处理所以无法使用Jabberd服务器的功能.&lt;br /&gt;
&lt;br /&gt;
|| 问题: 以上描述是真实和准确的吗? ||&lt;br /&gt;
&lt;br /&gt;
''order'' 子段落指定规则被检查的顺序(先检查allow规则再检查deny规则还是先检查deny规则再检查allow规则). 设置IP限制，要么使用 ''access'' 子段落 的 ''order'' 下的allow要么使用deny标签. 忽略deny和allow规则那么所有连接都可以接受 — 这也是缺省设置.&lt;br /&gt;
&lt;br /&gt;
===别名===&lt;br /&gt;
&lt;br /&gt;
''aliases'' 段落提供被连接的外部服务的支持, 例如MU Conference和JUD. 这些外部服务通过被连接的配置直接连接到 ''router'' . 每个 ''alias'' 为组件指定一个可解析的名字并且 ''target'' 指定 ''service id'' ， 和被连接的外部组件的XML文件里的一样. 更多关于被连接的外部服务的信息参见 [[Jabberd2:安装和管理指南#常规管理任务|6.5]] .&lt;br /&gt;
&lt;br /&gt;
===功能访问控制===&lt;br /&gt;
&lt;br /&gt;
''aci'' 段落指定 ''router-users.xml'' 里的每个用户的访问类型. 缺省的, ''jabberd'' 用户被授予全权因为其他Jabberd组件都以 ''Jabberd'' 用户来连接到 ''router'' . 本段特别要注意例子中的一个用户类型 'acl type = 'log''. 这个用户可以接收到所有经过router的包, 也就是说, 所有Jabberd服务器处理的包.&lt;br /&gt;
&lt;br /&gt;
尽管Jabberd没有一个机制来记录所有的包, 这样的机制可以很容易的通过给一个用户指定 'acl = 'log'' 权限，再创建一个组件以这个用户的身份连接到router来提供. 这样一个组件将能记录所有的Jabberd包.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section07/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Router-users.xml配置==&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文件的唯一的用途是提供一个用户和密码对的列表给 ''router'' 来验证. 缺省的用户( ''jabberd'' ) 是给其他Jabberd组件 ( ''sm'' , ''resolver'' , ''s2s'' 和 ''c2s'' ) 连接验证用的.&lt;br /&gt;
&lt;br /&gt;
''router-users.xml'' 文集看可能不应该有它自己的段落, '''除了强烈鼓励所有的Jabberd管理员在生产服务器上修改缺省密码''' . 使用缺省密码( ''secret'' ) 会让你的Jabberd安装容易被黑客攻击.&lt;br /&gt;
&lt;br /&gt;
一旦 ''router-users.xml'' 的缺省密码修改后, 响应的密码也必须在以下文件中修改:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      sm.xml&lt;br /&gt;
      resolver.xml&lt;br /&gt;
      s2s.xml&lt;br /&gt;
      c2s.xml&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些密码位于上述文件中的 ''Router connection configuration'' 标签附近.&lt;br /&gt;
&lt;br /&gt;
[http://www.jabberdoc.org/section08/html2pdf 以PDF格式查看]&lt;br /&gt;
&lt;br /&gt;
==Sm.xml配置==&lt;br /&gt;
===Jabberd身份===&lt;br /&gt;
===和Router通讯===&lt;br /&gt;
===日志===&lt;br /&gt;
===数据库连接和配置===&lt;br /&gt;
===管理功能的访问控制===&lt;br /&gt;
===会话调用的模块===&lt;br /&gt;
===外部组件的静态查询设置===&lt;br /&gt;
===用户选项===&lt;/div&gt;</summary>
		<author><name>How</name></author>	</entry>

	</feed>