Ejabberd 安装部署
Summary: Author: 张亚飞 | Read Time: 4 minute read | Published: 2017-08-08
Filed under
—
Categories:
DevOps
—
Tags:
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/
- 配置文件
- 覆盖
/etc/ejabberd/ejabberd.yml
文件
cp ~/Server/Run/Document/Server/Config/Ejabberd/Common_etc_ejabberd_ejabberd.yml /etc/ejabberd/ejabberd.yml
- 修改
/etc/ejabberd/ejabberdctl.cfg
文件
修改如下部分
#ERLANG_NODE=ejabberd@localhost
ERLANG_NODE=ejabberd@coopens.com
- 新增
/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).
启动
Ejabberd
报如下错误:
$ 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
更新升级记录
- 首先更新服务器
Server
端Ejabberd
编译源码
cd ~/Server/Run/Erlang
sudo zip -r ejabberd.zip ejabberd
sudo rm -r ejabberd
sudo git clone https://github.com/processone/ejabberd.git
更新笔记本电脑的
Ejabberd
开发源码,直接复制掉原版代码在笔记本电脑修改
Ejabberd
依赖配置文件rebar.config
修改部分如下
{emysql, ".*", {git, "https://github.com/coam/Emysql.git"}}
添加依赖后再上传覆盖到服务器 rebar.config
默认配置
- 服务器编译
///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