编译安装Erlang+RabbitMQ

楔子

由于国内信创越来越火,客户现场也开始使用国产操作系统替换CentOS之类的开源操作系统,最近做实施的同事找到我,说现场是ARM架构的操作系统编译安装RabbitMQ一直提示无法启动也没有日志文件生成,找过了好几个同事都没解决这才找到我。我就在这里记录下安装步骤及碰到的问题与解决办法。

环境说明

名称 版本
麒麟操作系统 V10系统 飞腾版 ARM 64位架构
Linux内核 4.19.90-24.4.v2101.ky10.aarch64
Erlang 24.2
RabbitMQ 3.9.1 unix通用版本

安装基础编译环境

yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl gtk2-devel binutils-devel

安装Erlang

# 解压erlang源码包到/usr/local/otp_src_24.2
tar -zxvf otp_src_24.2.tar.gz -C /usr/local
# 进入erlang源码编译目录
cd /usr/local/otp_src_24.2/
# 创建安装目录
mkdir /usr/local/erlang
# 检查编译环境,设置安装目录
./configure --prefix=/usr/local/erlang
# 编译 & 安装
make 
make install
# 将编译安装的erlang加入环境变量,并使之生效(无需进入目录即可执行)
echo 'export PATH=$PATH:/usr/local/erlang/bin' >> /etc/profile
source /etc/profile
# 查看是否安装成功
erl -version

安装RabbitMQ

# 解压rabbitmq安装包
tar -xvf rabbitmq-server-generic-unix-3.9.1.tar.xz
# 移动rabbitmq目录到/usr/local/rabbitmq
mv rabbitmq-server-generic-unix-3.9.1 /usr/local/rabbitmq
# 将rabbitmq加入环境变量,并使之生效(无需进入目录即可执行)
echo 'export PATH=$PATH:/usr/local/rabbitmq/sbin' >> /etc/profile
source /etc/profile

启动RabbitMQ

# 后台启动
rabbitmq-server -detached
# 查看状态
rabbitmqctl status
# 启用管理插件
rabbitmq-plugins enable rabbitmq_management

初始化用户

# 添加用户 用户名admin  密码123456 ,密码可以自己指定
rabbitmqctl add_user admin 123456
# 给budget分配vhost
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
# 分配管理权限
rabbitmqctl set_user_tags admin administrator
# 重启rabbitmq
rabbitmqctl stop && rabbitmq-server -detached

重启后访问 15672 端口进入Web管理界面,安装与初始化部署到这里就结束了,下边记录些错误情况

遇到的问题

执行 rabbitmq-server 报如下错误:

 {"init terminating in do_boot",{error,{crypto,{"no such file or directory","crypto.app"}}}}
init terminating in do_boot ({error,{crypto,{no such file or directory,crypto.app}}})

提示crypto库找不到,原因是在编译Erlang时crypto依赖的openssl库没找到。

解决办法:安装 openssll、openssl-devel,重新编译安装

yum install -y openssl openssl-devel
cd <Erlang编译目录>
make clean
./configure --prefix=/usr/local/erlang
make
make install

这个错误有参考价值,就拿过来记录下。虽然我在操作时也提示是这个问题,但并不是我编译安装的位置提示出来的!之前几个同事编译时未安装openssl,编译出有问题的Erlang并放到了环境变量很靠前的位置,导致我编译正确的Erlang没被执行。。所以在这里我推荐大家编译安装后用which查一下你的命令是从哪响应的。

参考:

Tags: