Ejabberd 安装部署

Summary: Author: 张亚飞 | 阅读时间: 4 minute read | Published: 2017-08-08
Filed under Categories: DevOpsTags: Linux, Server, Software, DevOps,

Ejabberd 编译安装

1. 首先安装相关依赖

  • Ejabberd 需要安装 Erlang 运行环境,否则编译会出错

  • 安装 ImageMagick 默认 开启 thumbnail: true 压缩图片需要安装 imagemagick ,否则启动 ejabberd 会报错,

sudo apt install imagemagick
  • 需要安装 yaml 依赖 wget http://pyyaml.org/download/libyaml/yaml-0.1.6.tar.gz tar -xzvf yaml-0.1.6.tar.gz cd yaml-0.1.6 ./configure make make install

安装编译完后,将会生成 /usr/local/lib/libyaml-0.so.2

17:50:19.132 [error] CRASH REPORT Process <0.105.0> with 0 neighbours exited with reason: 
{{load_failed,"Failed to load  NIF library /lib/fast_yaml-1.0.3/priv/lib/fast_yaml: 'libyaml-0.so.2: cannot open shared object file: No such file or directory'"},{fast_yaml_app,start,[normal,[]]}} in application_master:init/4 line 134

可能需要手动将 其复制到系统 /usr/local/lib/

cd /usr/local/lib/
sudo cp libyaml-0.so.2 /usr/lib/x86_64-linux-gnu/

或者也可以简单方法 ,但是没试过 参考 [](http://stackoverflow.com/questions/25425068/ejabberd-configure-error-libyaml-library-was-not-found)

sudo apt install libyaml-dev

如果没有安装 编译安装 Ejabberd 过程中将会出现如下错误:

configure: error: libyaml header file yaml.h was not found
ERROR: Command ['get-deps'] failed!

下载 ejabberd 源码,编译安装:

cd /opt/data
# sudo git clone https://github.com/processone/ejabberd.git
sudo wget https://github.com/processone/ejabberd/archive/16.09.tar.gz
tar -zxvf 16.09.tar.gz
cd ejabberd-16.09
sudo ./autogen.sh
#sudo ./configure --enable-all 

sudo ./configure --enable-odbc --enable-mysql --enable-redis --enable-elixir --enable-zlib --enable-iconv --enable-tools --enable-user --enable-debug --enable-pam --enable-hipe --enable-latest-deps --enable-full-xml --enable-roster-gateway-workaround --enable-erlang-version-check
    
sudo ./configure --enable-odbc --enable-mysql
# --enable-json
# ./configure --prefix=/Users/allran/SDK/chart/my-ejabberd --enable-mysql        //附加mysql
# ./configure --prefix=/Users/allran/SDK/chart/my-ejabberd --enable-all     //附加所有
#./rebar get-deps
#./rebar compile
sudo make
sudo make install
  • --enable-tools 在当前用户目录添加 .ejabberd-modules 目录 –> [ejabberd-contrib] 项目

注:如果安装失败,清除掉痕迹: make distclean

将会分别安装到以下相关目录:

配置文件 /etc/ejabberd/
Install ejabberd binary, header and runtime files in /lib/ejabberd/
Install the administration script: /sbin/ejabberdctl
ejabberd 帮助文档 /share/doc/ejabberd/
Create a spool directory: /var/lib/ejabberd/
日志文件: /var/log/ejabberd/
  • 配置文件
  1. 覆盖 /etc/ejabberd/ejabberd.yml 文件
cp ~/Server/Run/Document/Server/Config/Ejabberd/Common_etc_ejabberd_ejabberd.yml /etc/ejabberd/ejabberd.yml
  1. 修改 /etc/ejabberd/ejabberdctl.cfg 文件

修改如下部分

#ERLANG_NODE=ejabberd@localhost
ERLANG_NODE=ejabberd@coopens.com
  1. 新增 /etc/ejabberd/ejabberd.pem 文件
cp ~/Server/Run/Document/Server/Config/Ejabberd/ejabberd.pem /etc/ejabberd/ejabberd.pem

  • 编译安装常见错误:
$ make
/data/home/coam/DevErlang/ejabberd/deps/cache_tab/src/ets_cache.erl:none: internal error in native_compile;

添加 -compile(no_native).

vi /data/home/coam/DevErlang/ejabberd/deps/cache_tab/src/ets_cache.erl

-module(ets_cache).
-compile(no_native).
-behaviour(gen_server).
$ sudo ejabberdctl live
Ejabberd clustering .erlang.cookie accessible by owner only
sudo chown -R root.root .erlang.cookie
sudo chmod -R 600 .erlang.cookie

Ejabberd 添加依赖

emysql

配置 rebar.config

Deps = [
    ...
    {emysql, ".*", {git, "git://github.com/Eonblast/Emysql.git"}}
],

加入 emaysql 编译出现错误

Compiled src/emysql_worker.erl
/data/home/coam/ServerCoam/Erlang/ejabberd/deps/emysql/include/emysql.hrl:38: type gb_tree() undefined
/data/home/coam/ServerCoam/Erlang/ejabberd/deps/emysql/include/emysql.hrl:39: type queue() undefined
ERROR: compile failed while processing /data/home/coam/ServerCoam/Erlang/ejabberd/deps/emysql: rebar_abort
make: *** [deps/.built] Error 1

原因是 emysql 暂时没有更新到 otp18 的支持 fork emysql 修改部分参见 https://github.com/deadtrickster/Emysql/commit/52b802098322aad372198b9f5fa9ae9a4c758ad1 修改 Deps 并重新编译 ejabberd

{emysql, ".*", {git, "https://github.com/coam/Emysql.git"}}

Ejabberd 更新升级记录

  1. 首先更新服务器 ServerEjabberd 编译源码
cd ~/Server/Run/Erlang
sudo zip -r ejabberd.zip ejabberd
sudo rm -r ejabberd
sudo git clone https://github.com/processone/ejabberd.git
  1. 更新笔记本电脑的 Ejabberd 开发源码,直接复制掉原版代码

  2. 在笔记本电脑修改 Ejabberd 依赖配置文件 rebar.config 修改部分如下

{emysql, ".*", {git, "https://github.com/coam/Emysql.git"}}

添加依赖后再上传覆盖到服务器 rebar.config 默认配置

  1. 服务器编译
///make distclean
git clone https://github.com/processone/ejabberd.git
./autogen.sh
./configure --enable-odbc --enable-mysql
make
sudo make install

三. 启用 mysql 支持

编译时使用扩展参数

./configure --enable-odbc --enable-mysql

如果提示以下错误:

failed to start application 'p1_mysql': {error,
                                         {"no such file or directory",
                                          "p1_mysql.app"}}

表示mysql依赖驱动未加载,修改 rebar.config.script 第88行,添加 p1_mysql 的依赖(注意 “1”为数字1,不是字母l):

照做会出现其他问题,后来只修改了 第 88 行,然后再执行以下命令引入依赖,没有报错.

./rebar get-deps 

新建数据库 IM_Ejabberd 按官方的源码,导入 /sql/mysql.sql

cd $HOME/RunProject/ejabberd/sql/
mysql -u zhangyanxi -p
...
mysql:> use IM_Ejabberd  
mysql:>source mysql.sql;

配置文件 /etc/ejabberd/ejabberd.yml 的修改,主要包括:

#auth_method: internal.
auth_method: odbc.

取消注释并设置数据库名称和密码:

odbc_type: mysql
odbc_server: "localhost"
odbc_database: "IM_Ejabberd"
odbc_username: "zhangyanxi"
odbc_password: "******"

重启

ejabberdctl live 
...
19:17:55.853 [info] Application p1_mysql started on node 'ejabberd@coopens.com'
...

没有报错,在启动日志看到上面那条 p1_mysql 记录,表示 ejabberd 服务器使用了新的数据库,这个时候数据库里边的数据全部为 0 条,使用命令

sudo ejabberdctl register zyfmix coopens.com ****** 

注册用户后,发现数据库表 users 已经有了新添加的用户记录:

根据网上介绍的配置经验:

新版的下面的模块配置项不用修改(添加_odbc),否则会报错


Ejabberd mnesia 远程连接

使用 observer 远程连接 mnesia 数据库

ejabberd mnesia 服务器

$ erl -name 'ejabberd@coopens.com' -mnesia dir '"/var/lib/ejabberd"' (ip为本机的ip,必须,否则不能ping通)
(ejabberd@coopens.com)1> auth:get_cookie(). (获取cookie,或者 erlang:get_cookie(). )
(ejabberd@coopens.com)2> 'JCNBOQTVXCDZNLCRJQUI'

复制cookie,然后在本机上操作:

$ erl -name yafei@192.168.1.102 -setcookie JCNBOQTVXCDZNLCRJQUI
(yafei@192.168.1.102)1> net_adm:ping('ejabberd@coopens.com').
(yafei@192.168.1.102)2> pong
(yafei@192.168.1.102)3> observer:start().

参考列表


Erlang OTP18 API更新

/data/home/coam/Server/Run/Erlang/ejabberd/deps/emysql/src/emysql_conn.erl:337: Warning: erlang:now/0: Deprecated BIF. See the "Time and Time Correction in Erlang" chapter of the ERTS User's Guide for more information.

使用 erlang:timestamp() 代替 erlang:now()


Comments

Cor-Ethan, the beverage → www.iirii.com