9.11. 安装Jabberd2服务器
jabberd2服务器还没正式进入Debian的软件包,但我们可从源码开始安装。下面介绍如何在Debian平台中如何从源码安装jabberd-2.0s10。这里的2.0s10表示jabberd2.0的第十个stable发行版。
到jabberd的官方网站下载最新的软件包jabberd-2.0s10.tar.gz。用tar -zxvf jabberd-2.0s10.tar.gz命令解压后会在当前目录下生成jabberd-2.0s10目录。
进入源码目录,我们就可以用configure工具配置软件包。但在配置前,先要安装一些支持软件包,分别是libssl-dev和libidn11-dev,还有libmysqlclient14-dev,该软件包用于支持Mysql数据库作为后台数据存储和用户验证,如果你想通过ldap目录服务器来进行用户认证,则还需安装libldap2-dev软件包。准备好后,运行以下命令配置jabberd2:
debian:~/inst/jabberd-2.0s10# ./configure --prefix=/usr/local/jabberd2 --enable-ldap --enable-debug
配置成功后,运行make和make install即可把软件安装到/usr/local/jabberd2目录中。
现在可以配置服务器了,jabberd2的配置文件位于/usr/local/jabberd2/etc/jabberd目录下,配置文件的文本是XML格式的。现在我们要修改sm.xml和c2s.xml这两个配置文件,把真实的服务器名写到这两个配置文件中:
修改sm.xml文件,把id标签内的localhost改成真实服务器名 <!-- Session manager configuration --> <sm> <!-- Our ID on the network. Users will have this as the domain part of their JID. If you want your server to be accessible from other Jabber servers, this ID must be resolvable by DNS.s (default: localhost) --> <id>localhost</id> ... 修改c2s.xml文件,也是把id标签内的localhost改成真实服务器名 ... <!-- Local network configuration --> <local> <!-- Who we identify ourselves as. This should correspond to the ID (host) that the session manager thinks it is. You can specify more than one to support virtual hosts, as long as you have additional session manager instances on the network to handle those hosts. The realm attribute specifies the auth/reg or SASL authentication realm for the host. If the attribute is not specified, the realm will be selected by the SASL mechanism, or will be the same as the ID itself. Be aware that users are assigned to a realm, not a host, so two hosts in the same realm will have the same users. If no realm is specified, it will be set to be the same as the ID. --> <id>localhost</id> ...
jabberd2默认使用MySQL来存放数据和进行用户认证。所以我们还要配置MySQL数据库,为jabberd2增加相应的数据库和表。jabberd2软件包已为我们提供了一个MySQL脚本自动完成数据库和表的创建。这个脚本位于源码目录下的tools目录中,文件名是db-setup.mysql。该目录还有针对不同数据库(Oracle、PostgreSQL)的脚本可用。我们以管理员身份登录MySQL服务器,用以下命令运行db-setup.mysql脚本。在运行脚本前,请确保该脚本在当前目录下。
debian:~/inst/jabberd-2.0s10/tools# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 68 to server version: 4.0.24_Debian-10sarge1-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> \. db-setup.mysql Query OK, 1 row affected (0.00 sec) Database changed Query OK, 0 rows affected (0.13 sec) Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.02 sec) ...
创建完数据库和表后,我们还要配置该数据库的访问权限,很简单,运行以下命令即可:
mysql> grant select,insert,delete,update on jabberd2.* to jabberd2@localhost identified by '123456'; Query OK, 0 rows affected (0.00 sec)
现在我们就在MySQL数据库创建一个jabberd2用户,密码是123456。该用户可以在jabberd2数据库中做select,insert,delete,update操作。为了使jabberd2服务器能登录该数据库,我们还需用"jabberd2"和"123456"这两个参数更新sm.xml和c2s.xml两个配置文件的相关内容。
修改sm.xml文件 ... <!-- Storage database configuration --> <storage> <!-- By default, we use the MySQL driver for all storage --> <driver>mysql</driver> <!-- Its also possible to explicitly list alternate drivers for specific data types. --> <!-- Store vcards in a PostgreSQL database instead --> <!-- <driver type='vcard'>pgsql</driver> --> <!-- MySQL driver configuration --> <mysql> <!-- Database server host and port --> <host>localhost</host> <port>3306</port> <!-- Database name --> <dbname>jabberd2</dbname> <!-- Database username and password --> <user>jabberd2</user> <pass>123456</pass> ... 修改c2s.xml ... <!-- MySQL module configuration --> <mysql> <!-- Database server host and port --> <host>localhost</host> <port>3306</port> <!-- Database name --> <dbname>jabberd2</dbname> <!-- Database username and password --> <user>jabberd2</user> <pass>123456</pass> </mysql> ...
最后一步,根据sm.xml或c2s.xml中pidfile标签的内容创建进程ID目录。在我的机器上sm.xml配置文件中pidfile标签的内容如下:
<pidfile>/usr/local/jabberd2/var/jabberd/pid/sm.pid</pidfile>
创建pid目录的命令如下:
debian:/usr/local/jabberd2# mkdir -p var/jabberd/pid/
是否创建该目录对服务器的正常运行没有影响,只是有了该目录后,当服务器运行时,在该目录下会生成jabberd2服务进程Id文件,我们可跟踪jabberd2服务器的进程Id号。
启动服务器
debian:/usr/local/jabberd2/bin# ./jabberd
如果启动不成功,可查询系统日志或用-D选项启动服务器。
服务器启动后,我们就可用Gaim等客户端连接它。具体操作和上一节内容一样,这里就不再讲了。
除了上面介绍的使用MySQL数据库作为用户认证数据库外,我们还可使用LDAP目录服务进行用户认证。下面介绍具体的配置过程,我选用的LDAP服务器是OpenLDAP,版本号是2.2.23-8。
要使jabberd2使用LDAP目录服务,需在源码配置时加--enable-ldap选项,并安装libldap2-dev软件包。
配置c2s.xml文件以支持ldap认证:
... <!-- Authentication/registration database configuration --> <authreg> <!-- Backend module to use --> <module>ldap</module> #启用ldap认证模块,默认是MySQL <!-- Registration configuration --> <register> <!-- Account registration is enabled by default (provided the auth/reg module in use supports it). Comment this out to disable. --> <!-- <enable/> --> #注释该行,禁止用户自由注册,启用ldap认证后,该功能失效。jabberd2暂时还不支持在LDAP服务器上创建用户信息。 ... <!-- LDAP module configuration --> #开始配置LDAP服务参数 <ldap> <!-- LDAP server host and port (default: 389) --> <host>Ldap_server</host> #配置LDAP服务器主机名 <port>389</port> #配置LDAP服务器端口 <!-- Use LDAP v3 if possible. If disabled, v2 will be used. Encryption options are only available if v3 is enabled. --> <!-- <v3/> --> <!-- Encryption. If enabled, this will create an encrypted channel to the LDAP server using the LDAP STARTTLS mechanism. --> <!-- <starttls/> --> <!-- Encryption. If enabled, this will create an encrypted channel to the server using the old-style "ldaps://" mechanism. It is recommended that you use <starttls/> instead of this. --> <!-- <ssl/> --> <!-- DN to bind as for searches. If unspecified, the searches will be done anonymously. --> <binddn>cn=admin,dc=com</binddn> #配置登录LDAP服务器的DN <bindpw>123456</bindpw> #配置登录密码 <!-- LDAP attribute that holds the user ID (default: uid) --> <uidattr>uid</uidattr> #配置用户认证属性 <!-- base DN of the tree. You should specify a DN for each authentication realm declared in the <local/> section above, by using the realm attribute. --> <basedn realm=">dc=user,dc=company,dc=com</basedn> #配置搜索路径起点 <!-- <basedn>o=Example Corp.</basedn> --> </ldap> ...
配置sm.xml文件,启用auto-create功能,自动始初化会话。
... <!-- User options --> <user> <!-- By default, users must explicitly created before they can start a session. The creation process is usually triggered by a c2s component in response to a client registering a new user. Enableing this option will make it so that a user create will be triggered the first time a non-existant user attempts to start a session. This is useful if you already have users in an external authentication database (eg LDAP) and you don't want them to have to register. --> <auto-create/> #该功能只在禁用公开注册,采用外部验证数据库时启用,开启该功能后,当用户第一次登录时,jabberd2会自动把用户信息插入到active表。 #如果开启公开注册功能,则应该禁用该功能,用户信息会在注册时自动插入到active表。 ...
配置完成后,重启Jabberd2服务器,如果配置正确,可在系统日志/var/log/message文件看到以下信息:
... Nov 24 11:33:17 t03 jabberd/sm[29600]: initialised storage driver 'mysql' #成功连接MySQL数据库 Nov 24 11:33:17 t03 jabberd/sm[29600]: version: jabberd sm 2.0s10 ... Nov 24 11:33:17 t03 jabberd/c2s[29602]: starting up Nov 24 11:33:17 t03 jabberd/c2s[29602]: process id is 29602, written to /usr/local/jabberd2/var/jabberd/pid/c2s.pid Nov 24 11:33:17 t03 jabberd/c2s[29602]: ldap: configured 1 realms Nov 24 11:33:17 t03 jabberd/c2s[29602]: initialised auth module 'ldap' #成功连接LDAP服务器 Nov 24 11:33:17 t03 jabberd/c2s[29602]: [t03.tigerhead] configured; realm=(null)
在jabberd2中,我们可以设置默认的好友列表模板,当用户第一次登录系统时就会自动获得该列表,不用手动一个用户一个用户地添加。要启用该功能,首先要在sm.xml配置文件的内进行配置。jabberd2默认是没有打开该功能的,我们只要在sm.xml文件中把template内的roster标签前的注释符删除即可。如:
... <!-- Templates. If defined, the contents of these files will be stored in the users data store when they are created. --> <template> <roster>/usr/local/jabberd2/etc/jabberd/templates/roster.xml</roster> </template> ...
从上面的配置可以看以,默认的模块是存放在/usr/local/jabberd2/etc/jabberd/templates/roster.xml目录下的。我们编辑roster.xml文件,按以下格式添加用户列表。
<!-- This is the roster template. If enabled in sm.xml, new users will get this roster by default. --> <query xmlns='jabber:iq:roster'> <!-- <item name='Helpdesk' jid='helpdesk@localhost' subscription='both'><group>Support</group></item> --> <item name='ringkee' jid='ringkee@company.com' subscription='both'><group>IT</group></item> <item name='diu167' jid='diu167@company.com' subscription='both'><group>IT</group></item> <item name='dongrui' jid='dongrui@company.com' subscription='both'><group>IT</group></item> <item name='sally' jid='sally@company.com' subscription='both'><group>IT</group></item> <item name='xmr' jid='xmr@company.com' subscription='both'><group>IT</group></item> </query>
上面设置了一个IT组,里面有5个用户。修改roster.xml文件后,不用重启服务器就可使修改生效。当用户首次登录时,这5个用户列表会自动下载到客户端。这种下载动作只会在用户首次登录系统时发生。当用户第一次登录时,jabberd2会在active表中插入一条记录,记录登录的用户帐号名和登录时间等信息。jabberd2以此判断用户是否第一次登录。同时把模板中的用户列表信息按登录用户的不同保存在roster-items和roster-groups两个表中。当用户第二次登录时,jabberd2在active中可以查询到用户帐号信息,就不会再把模板中的用户列表信息保存到roster-items和roster-groups表中。而是直接下载roster-items和roster-groups表中的用户列表信息来使用。当用户在客户端手工删除用户列表后,jabberd2会直接删除roster-items和roster-groups表中的用户列表信息。这样,下次用户登录时就找不到用户列表了,所以我们不要随便删除用户列表信息。为了使删除后的用户列表能重新下载或更新,我们可在active表中删除该用户的帐号记录。下次用户登录系统时,系统还会把你当成是首次登录,又会自动下载模板中的用户列表。
jabberd2系统的所有信息都保存在MySQL数据库的jabberd2数据库中。一面介绍jabberd2数据库各个表的作用。
active表,存放用户名和用户第一次登录的时间。表中的记录在用户第一次登录系统时插入,以后用户登录系统不影响该记录的内容。
authreg表,当选择MySQL数据库作为jabberd2的用户验证数据库时,该 表才有意义。它用以存放用户的验证信息,如用户名、密码和范围。
disco-items表,记录离线信息。
logout表,记录用户最近的登出信息,包括jid和时间戳。
motd-message表,记录XML格式的MOTD(Message Of The Day)信息。
motd-message表,记录接收的MOTD信息内容,包括jid和时间戳。
privacy-default表,
privacy-items表,
private表,以XML格式存放用户的私人信息,如收藏夹、爱好等。
queue表,存放排序信息。
roster-groups表,保存已分组的用户列表信息。
roster-items表,保存用户列表信息,包含验证状态信息。
vacation-setting表,
vcard表,保存用户帐号信息,包含用户名、住址、URL和职务等。
jabberd2服务器由一系列的进程组成,各进程互相依赖。如果要手动杀死jabberd2进程,则要按一定的顺序。如:
#!/bin/bash killall router killall resolver killall c2s killall s2s killall sm
由于Jabber协议的开放性,造就了众多的开源的Jabber客户端,在http://www.jabber.org上有一个Jabber Client软件的列表可供参考。我试过几种,从功能和中文支持上推荐Psi和Gaim两种。还有一个基于Web的Jabber客户端jwchat,它利用punjab这个HTTP jabber client接口和Ajax技术,可在浏览器上登录jabber服务器进行即时通信。jwchat网站上有一个Demo,大家可以去看看,很不错的。但我没安装成功,有谁成功安装,请指点一二。