RabbitMQ是一个开源的强大的企业消息系统,支持主流的操作系统,支持多种开发语言。我们项目中使用RabbitMQ作为消息队列,解耦业务,构建高可靠的消息队列系统。RabbitMQ可以用在订单系统、日志系统、数据收集等常见场景中。
本文我们介绍如何在CentOS上安装当前最新版的RabbitMQ:v3.8.1,以及如何使用Docker来安装RabbitMQ。
安装 RabbitMQ 之前要安装 Erlang,需要先到RabbitMQ官网看下版本对应关系。
当前最新版rabbitmq-server是 3.8.14,最新版Erlang是 23.x。我们可以分别在Github和RabbitMQ官网下载对应的版本的rpm包。
访问 Erlang 的 Github,如下:https://github.com/rabbitmq/erlang-rpm/releases
- # 下载地址
- https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.2/erlang-23.3.2-1.el7.x86_64.rpm
访问 RabbitMQ 的官网,如下:https://www.rabbitmq.com/install-rpm.html#downloads
- # 下载地址
- wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14-1.el7.noarch.rpm
下载好rpm包后,接下来我们使用rpm进行安装。
首先安装依赖socat,安装Erlang时需要这个。
yum install -y socat
接下来安装Erlang和RabbitMQ。
- rpm -ivh erlang-23.3.2-1.el7.x86_64.rpm
- rpm -ivh rabbitmq-server-3.8.14-1.el7.noarch.rpm
执行上述两行命令后,即完成了Erlang和RabbitMQ的安装,就这么简单。
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
- #查看启动后的情况
- rabbitmqctl status
-
- #关闭服务
- rabbitmqctl stop
-
- #重启rabbitmq
- systemctl restart rabbitmq-server
-
- #服务状态
- systemctl status rabbitmq-server
-
- #查看所有队列
- rabbitmqctl list_queues
-
- # 清除某个队列的数据
- rabbitmqctl purge_queue queueName
-
- # 清除所有队列数据以及用户数据、配置数据:慎用,记得要先把MQ 的meta data备份出来,reset后,将meta data导入即可。
- rabbitmqctl reset
- 但是在使用此命令前,要先关闭应用,否则不能清除。关闭应用的命令为:
- rabbitmqctl stop_app
- 执行了这两条命令后再次启动此应用。命令为:
- rabbitmqctl start_app
- 再次执行命令:
- rabbitmqctl list_queues
-
- #查看所有虚拟主机
- rabbitmqctl list_vhosts
-
- #添加用户:
- rabbitmqctl add_user username password
-
- #列出所有用户:
- rabbitmqctl list_users
-
- #删除用户:
- rabbitmqctl delete_user username
-
- #清除用户权限:
- rabbitmqctl clear_permissions -p vhostpath username
-
- #列出用户权限:
- rabbitmqctl list_user_permissions username
-
- #修改密码:
- rabbitmqctl change_password username newpassword
-
- #设置用户权限:
- rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*"
-
- #创建虚拟主机:
- rabbitmqctl add_vhost vhostpath
-
- #列出所以虚拟主机:
- rabbitmqctl list_vhosts
-
- #列出虚拟主机上的所有权限:
- rabbitmqctl list_permissions -p vhostpath
-
- #删除虚拟主机:
- rabbitmqctl delete_vhost vhost vhostpath
-
- #移除所有数据,要在 rabbitmqctl stop_app 之后使用:
- rabbitmqctl reset
-
- #组成集群命令:
- rabbitmqctl join_cluster
[--ram] -
- #查看集群状态:
- rabbitmqctl cluster_status
-
- #修改集群节点的存储形式:
- rabbitmqctl change_cluster_node_type disc | ram
-
- #摘除节点:
- rabbitmqctl forget_cluster_node [--offline]
-
- #修改节点名称:
- rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2 newnode2] [oldnode3 newnode3...]
rabbitmq-plugins enable rabbitmq_management
执行如下:
- rabbitmqctl add_user admin admin
- rabbitmqctl set_user_tags admin administrator
执行如下:
- rabbitmqctl add_vhost admin
- rabbitmqctl set_permissions -p admin admin ".*" ".*" ".*"
执行如下:
- #插件列表:
- rabbitmq-plugins list
- #启动插件:
- rabbitmq-plugins enable XXX (XXX为插件名)
- #停用插件:
- rabbitmq-plugins disable XXX
http://localhost:15672/, 刚才我们设置了admin用户,所以可以使用admin登录,也可以使用默认账号和密码都是guest登录。进入管理界面后可以看到:
使用账号/密码:admin / admin 进行登录,如下:
我们可以在后台管理用户、队列等信息。
RabbitMQ默认开启了几个端口:
4369
:erlang发现口
5672
:client端通信口,客户端要连接RabbitMQ服务时要用到
15672
:后台管理界面ui端口,进入管理后台时访问url如:http://localhost:15672/
25672
:server间内部通信口
有时候在生产环境下,我们出于安全等原因希望修改掉默认的端口号。
我们安装新版的 RabbitMQ-3.8.x 后,发现找不到它的配置文件,按常理,服务的端口开发都可以在配置文件里配置的。但是事实上RabbitMQ-3.8.1并没有生成配置文件,需要我们手动添加配置文件。
- [root@..]# ls /etc/rabbitmq/rabbitmq.conf
- ls: cannot access /etc/rabbitmq/rabbitmq.conf: No such file or directory # 需要手动添加
官方建议配置文件的位置:/etc/rabbitmq/rabbitmq.conf
我们现在要做的是把默认端口5672改成56720,并且允许远程访问。把web管理默认端口15672改成56271。只需如下配置:
- # vim /etc/rabbitmq/rabbitmq.conf
- # AMQP 0-9-1 and 1.0 port,默认5672,允许远程访问
- listeners.tcp.default = 0.0.0.0:56720
- # web管理,默认15672
- management.tcp.port = 56721
- management.tcp.ip = 0.0.0.0
执行如下:
保存,并重启RabbitMQ服务。
- systemctl restart rabbitmq-server
- systemctl status rabbitmq-server
使用netstat -lntp
查看端口监听情况:
我们可以到官网地址:https://www.rabbitmq.com/configure.html,了解RabbitMQ的性能优化方面的配置。
在开发环境中,我们也可以直接使用 Docker 进行安装更加方便,下面我们继续使用Docker来安装一遍。
首先,我们得安装docker环境。
yum install -y docker
查看docker的版本:
- [root@server docker]# docker version
- Client:
- Version: 1.13.1
- API version: 1.26
- Package version: docker-1.13.1-208.git7d71120.el7_9.x86_64
- Go version: go1.10.3
- Git commit: 7d71120/1.13.1
- Built: Mon Jun 7 15:36:09 2021
- OS/Arch: linux/amd64
-
- Server:
- Version: 1.13.1
- API version: 1.26 (minimum version 1.12)
- Package version: docker-1.13.1-208.git7d71120.el7_9.x86_64
- Go version: go1.10.3
- Git commit: 7d71120/1.13.1
- Built: Mon Jun 7 15:36:09 2021
- OS/Arch: linux/amd64
- Experimental: false
- [root@server docker]#
- [root@ ~]# docker search rabbitmq
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- rabbitmq RabbitMQ is an open source multi-protocol me… 3703 [OK]
- bitnami/rabbitmq Bitnami Docker Image for RabbitMQ 62 [OK]
- tutum/rabbitmq Base docker image to run a RabbitMQ server 22
- kbudde/rabbitmq-exporter rabbitmq_exporter for prometheus 15 [OK]
- frodenas/rabbitmq A Docker Image for RabbitMQ 12 [OK]
- cyrilix/rabbitmq-mqtt RabbitMQ MQTT Adapter 9 [OK]
- arm32v7/rabbitmq RabbitMQ is an open source multi-protocol me… 7
docker pull docker.io/rabbitmq
- [root@server docker]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker.io/rabbitmq latest ba647756d55a 3 days ago 221 MB
- [root@server docker]#
docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -v /data:/var/lib/rabbitmq docker.io/rabbitmq
整理写一个重启服务脚本:
- [root@server docker_rabbitmq]# cat restart_service.sh
- #!/bin/sh
- basedir=`pwd`
- datadir=$basedir/data
-
- image=docker.io/rabbitmq
- name=rabbitmq
-
- mkdir -p $datadir
-
- # docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -v /data:/var/lib/rabbitmq rabbitmq:3.8.1-management
- docker stop $name
- docker rm $name
- docker run -d --name=$name --restart always -p 5672:5672 -p 15672:15672 -v $datadir:/var/lib/rabbitmq $image
- [root@server docker_rabbitmq]#
最后,使用docker ps
查看运行的容器。
- [root@server docker_rabbitmq]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- b959544500f4 docker.io/rabbitmq "docker-entrypoint..." 2 seconds ago Up 1 second 4369/tcp, 0.0.0.0:5672->5672/tcp, 5671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmq
这样,一个RabbitMQ的docker环境就装好了。
rabbitmq-plugins enable rabbitmq_management
执行如下:
- [root@server docker_rabbitmq]# docker exec -it rabbitmq bash
- root@b959544500f4:/# rabbitmq-plugins enable rabbitmq_management
- Enabling plugins on node rabbit@b959544500f4:
- rabbitmq_management
- The following plugins have been configured:
- rabbitmq_management
- rabbitmq_management_agent
- rabbitmq_prometheus
- rabbitmq_web_dispatch
- Applying plugin configuration to rabbit@b959544500f4...
- The following plugins have been enabled:
- rabbitmq_management
-
- started 1 plugins.
- root@b959544500f4:/#
此时可以通过浏览器访问管理页:http://localhost:15672/
可以通过默认的账号 guest / guest 登录如下:
- rabbitmqctl add_user admin admin
- rabbitmqctl set_user_tags admin administrator
执行如下:
- root@b959544500f4:/# rabbitmqctl add_user admin admin
- Adding user "admin" ...
- Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
- root@b959544500f4:/#
- root@b959544500f4:/# rabbitmqctl set_user_tags admin administrator
- Setting tags for user "admin" to [administrator] ...
- root@b959544500f4:/#
- rabbitmqctl add_vhost admin
- rabbitmqctl set_permissions -p admin admin ".*" ".*" ".*"
执行如下:
- root@b959544500f4:/# rabbitmqctl add_vhost admin
- Adding vhost "admin" ...
- root@b959544500f4:/# rabbitmqctl set_permissions -p admin admin ".*" ".*" ".*"
- Setting permissions for user "admin" in vhost "admin" ...
- root@b959544500f4:/#
- #插件列表:
- rabbitmq-plugins list
- #启动插件:
- rabbitmq-plugins enable XXX (XXX为插件名)
- #停用插件:
- rabbitmq-plugins disable XXX
- rabbit的配置文件目录:/etc/rabbitmq
- rabbit的数据文件目录:/var/lib/rabbitmq
- rabbit的日志文件目录:/var/log/rabbitmq
如果需要持续化,可以挂在这些路径:
- # 创建挂在路径
- mkdir -p ~/rabbitmq/{etc,lib,var/{lib,log}}
-
- # 启动容器
- docker run -d -p 1883:1883 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 61613:61613 -p 61614:61614 -v ~/rabbitmq/etc:/etc/rabbitmq -v ~/rabbitmq/lib:/var/lib/rabbitmq -v ~/rabbitmq/log:/var/log/rabbitmq --name rabbit rabbitmq:management
前面我们使用命令行创建了一个admin用户,也可以在页面上创建,如下:
在这里可以选择不同的角色来创建用户。
角色说明:
1、 超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、 监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、 策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、 普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
下面切换 libai 这个用户登录一下,如下:
提示了这个告警:
Stats in management UI are disabled on this node
解决措施:
- #进入rabbitmq容器
- docker exec -it {rabbitmq容器名称或者id} /bin/bash
-
- #进入容器后,cd到以下路径
- cd /etc/rabbitmq/conf.d/
-
- #修改 management_agent.disable_metrics_collector = false
- echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
-
- #退出容器
- exit
-
- #重启rabbitmq容器
- docker retart {rabbitmq容器id}
下面我们执行如下:
- # 进入配置目录
- root@b959544500f4:/# cd /etc/rabbitmq/conf.d/
- root@b959544500f4:/etc/rabbitmq/conf.d# ls
- 10-default-guest-user.conf management_agent.disable_metrics_collector.conf
- root@b959544500f4:/etc/rabbitmq/conf.d#
- # 查看当前的配置
- root@b959544500f4:/etc/rabbitmq/conf.d# cat management_agent.disable_metrics_collector.conf
- management_agent.disable_metrics_collector = true
- # 修改配置
- root@b959544500f4:/etc/rabbitmq/conf.d# echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
- root@b959544500f4:/etc/rabbitmq/conf.d#
- # 查看修改后的配置
- root@b959544500f4:/etc/rabbitmq/conf.d# cat management_agent.disable_metrics_collector.conf
- management_agent.disable_metrics_collector = false
- root@b959544500f4:/etc/rabbitmq/conf.d#
- root@b959544500f4:/etc/rabbitmq/conf.d# exit
- exit
- [root@server docker_rabbitmq]# ls
- data restart_service.sh
- # 重启容器
- [root@server docker_rabbitmq]# docker restart rabbitmq
- rabbitmq
- [root@server docker_rabbitmq]#
配置完毕后,再访问页面如下: