引言
RabbitMQ是一种广泛使用的开源消息中间件,能够有效地处理异步消息传递。无论是构建微服务架构、实时数据处理,还是实现系统解耦,RabbitMQ 都是开发者的重要工具。
本文将重点介绍如何在两大主流Linux派系:Debian 和 RedHat 中安装RabbitMQ,并配置基本设置,以帮助你快速上手这个强大的消息队列系统。
本文针对 Debain 12、Ubuntu 24(LTS)、Centos7 这三款Linux做一个详细的部署案例;
<math xmlns="http://www.w3.org/1998/Math/MathML"> 本文部署采用两种方式: \color{#f00}{本文部署采用两种方式:} </math>本文部署采用两种方式:
第一种是基于包管理器apt、yum安装。 (可能版本较老,不喜欢折腾的选此方法)
第二种是基于源码包方式直接编译。 (版本是最新的,喜欢折腾的入,但操作费时费力)
注:当采用包管理安装时则Erlang和RabbitMQ都应该采用相同方式,反之源码编译方式也是一样。
一:RabbitMQ相关概念说明
(一):为何会使用MQ
MQ(message queue)本质上是个队列,FIFO先入先出,只不过队列中存放的内容是message消息,但它还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游逻辑解耦 + 物理解耦
的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其它服务。
点开查看详情:MQ的几大应用场景
cpp
'》流量消峰'
在订单系统中,假设其最大处理能力为每秒10000次订单。在正常情况下,这个处理能力足以应对日常的下单需求,
用户通常可以在一秒内收到下单结果。然而在高峰期,如果订单量激增至每秒20000次,系统将无法承受,可能导致
服务响应缓慢甚至宕机。为了避免这种情况,我们可以通过消息队列来缓冲订单请求,从而取消对下单数量的限制。
这样超出处理能力的订单将被分散到一段时间内进行处理。虽然部分用户可能需要等待几秒才能收到下单成功的通知,
但相比于完全无法下单的体验,这种方式显然更为友好。
'》应用解耦'
以电商应用为例,系统通常包括订单、库存、物流和支付等多个模块。如果这些模块之间紧密耦合,任何一个子系统
出现故障都会导致下单操作异常。然而采用基于消息队列的架构后,系统之间的耦合度显著降低。如假设物流系统发
生故障并需要几分钟进行修复。在此期间,所有待处理的请求信息将被存储在消息队列中,用户的下单操作仍然可以
正常完成。当物流系统恢复后,它可以继续处理队列中的订单信息,用户在此过程中不会感受到物流系统的故障,从
而提升了系统的可用性。
'》异步处理'
有些场景中,服务之间调用是异步的。如服务A调用服务B,而B的执行可能需要较长时间。在传统的实现中,A通常会
选择定期调用B的查询API来检查其执行状态,或者提供一个回调API,让B在执行完成后通知A。这两种方式都显得不
够优雅。通过使用消息队列,A只需监听B处理完成的消息。当B完成处理后,会向消息队列发送一条消息,MQ将其转
发给A。这样A既不需要循环调用B的查询API,也不需要提供回调API,B服务也无需处理这些额外的逻辑。最终A服务
能够及时接收到异步处理成功的消息,提升了系统的效率和可维护性。

(二):什么是RabbitMQ
RabbitMQ
是一个基于AMQP(高级消息队列协议)实现的可复用企业消息系统。它用于大型软件系统中各个模块之间的高效通信,支持高并发和可扩展性。我们可以将RabbitMQ比作一个快递站。当您需要发送一个包裹时,您将包裹放入快递站,快递员会将其送到收件人手中。类似地,RabbitMQ充当了一个快递站,负责接收、存储和转发消息数据,而不是处理消息内容。
AMQP(Advanced Message Queuing Protocol)
是一种应用层标准的开放协议,旨在提供统一的消息服务。它为面向消息的中间件设计,允许基于该协议的客户端与消息中间件之间进行消息传递,而不受客户端和中间件的不同产品或开发语言的限制。
消息队列(MQ,Message Queue)
是一种应用程序之间的通信方法。应用程序通过读写消息队列中的消息(即应用程序的数据)进行通信,而无需建立专用的连接。消息传递的方式是通过在消息中发送数据进行通信,而不是直接调用彼此的接口。使用消息队列的好处在于,它消除了接收和发送应用程序必须同时执行的要求。在项目中,可以将一些不需要即时返回且耗时的操作提取出来进行异步处理,这种异步处理方式大大节省了服务器的请求响应时间,从而提高了系统的吞吐量。
(三):RabbitMQ四大核心
sh
'生产者(Producer):'
它是指产生数据并发送消息的程序。它负责将消息发送到RabbitMQ的交换机。
'消费者(Consumer):'
它是指接收消息的程序,通常是一个等待接收消息的应用。
需要注意的是,生产者、消费者和消息中间件(RabbitMQ)通常并不在同一台机器上。
同一个应用程序可以同时充当生产者和消费者。
'交换机(Exchange):'
它是RabbitMQ中非常重要的组件。它一方面接收来自生产者的消息,另一方面将这些消息推送到队列中。
交换机必须明确如何处理接收到的消息,包括将消息推送到特定队列、多个队列,或者丢弃消息。这一行为
由交换机的类型决定。
'队列(Queue):'
它是RabbitMQ内部使用的一种数据结构。尽管消息在RabbitMQ和应用程序之间流动,但它们只能存储在队列中。
队列的存储能力仅受主机的内存和磁盘限制,实际上是一个大的消息缓冲区。多个生产者可以将消息发送到同一个队列,
而多个消费者可以尝试从该队列接收数据,这就是我们使用队列的方式。
(四):RabbitMQ流程介绍
点开查看详情:关于RabbitMQ的一些术语说明
sh
'Broker(消息代理)'
接收和分发消息的应用,RabbitMQ Server就是消息代理(Message Broker)。
简单来说,它是消息队列服务器的实体。
'Virtual Host(虚拟主机)'
为了多租户和安全性,RabbitMQ将AMQP的基本组件划分到一个虚拟分组中,
类似于网络中的命名空间(namespace)概念。当多个不同用户使用同一个RabbitMQ服务器时,
可以划分出多个虚拟主机(vhost),每个用户可以在自己的vhost中创建交换机、队列等。
'注:这一点很有必要,因为多个项目使用一台RabbitMQ服务器时,通过vhost来分割空间,达到区分项目。'
'Connection(连接)'
Connection是发布者(publisher)/消费者(consumer)与Broker之间的TCP连接。
'Channel(通道)'
Channel是RabbitMQ中的消息通道。如果每次访问RabbitMQ都建立一个新的Connection,
在高消息量的情况下,建立TCP连接的开销将会非常大,从而导致效率降低。为了解决这个问题,
Channel是在Connection内部创建的逻辑连接。
在支持多线程的应用程序中,通常每个线程会创建一个独立的Channel进行通信。
AMQP协议中的方法包含Channel ID,这有助于客户端和消息代理识别不同的Channel,
因此各个Channel之间是完全隔离的。
作为轻量级的Connection,Channel显著减少了操作系统在建立TCP连接时的开销,从而提高了整体的通信效率。
'Exchange(交换机)'
Exchange是消息到达Broker的第一站。根据分发规则,Exchange会匹配查询表中的路由关键字(routing key),
并将消息分发到相应队列。常用的Exchange类型包括:direct(点对点)、topic(发布-订阅)和fanout(多播)。
'Queue(队列)'
队列是消息的载体,每条消息都会被投入到一个或多个队列中,消息最终在这里等待消费者取走。
'Routing Key(路由关键字)'
Routing Key是路由关键字,Exchange根据这个关键字进行消息投递。
'Binding(绑定)'
Binding是Exchange和Queue之间的虚拟连接,Binding中可以包含Routing Key。Binding信息被保存
到Exchange中的查询表中,用于消息的分发依据。它的作用是将Exchange和Queue按照路由规则绑定在一起。
'Producer(生产者)'
Producer是消息生产者,负责投递消息的程序。
'Consumer(消费者)'
Consumer是消息消费者,负责接收消息的程序。
二:RabbitMQ和Erlang兼容性
RabbitMQ与Erlang之间的兼容性非常重要,因为RabbitMQ是用Erlang编写的。 具体的版本要求在官方网站上是可以进行查询的,一定要自己查看对应的版本,要不然会出现无法安装或者一些稀奇古怪的问题。
RabbitMQ和Erlang兼容性版本官方查询列表 (下图是官方说明)
比如我通过apt命令在Ubuntu24.4发行版中安装了 Erlang 25,那RabbitMQ最大版本不能超过3.12.x。如下图也可以看出RabbitMQ 4.0.3不能使用 Erlang 27。

三:安装Erlang环境
Erlang是一种通用的编程语言,最初由爱立信开发,主要用于构建高并发、分布式和容错的系统。Erlang的设计目标是支持电信系统的开发,但它的特性使其在其他领域(如即时通讯、金融服务和大规模web应用)中也得到了广泛应用。而RabbitMQ是一个基于Erlang的消息代理(message broker) ,它利用Erlang的特性来实现高效的消息传递和处理。所以在安装RabbitMQ时,必须先安装Erlang环境。
注:安装Erlang完毕后务必查看Erlang安装的版本:
erl -noshell -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().'
(一):基于包管理器安装
这种方式安装的版本,往往是根据对应系统不同的发行版镜像库来进行下载安装的,所以总结一句:越是最新的Linux发行版下载安装的Erlang版本往往是最贴近官方最新版本的。安装后一定要按照自己下载的Erlang对应版本去找适合自己的RabbitMQ版本。
点击跳转官方教程;进入后点击 Erlang OTP 选择对应的系统。会有对应系统的deb和rpm包下载,其中deb包是不推荐使用这种dpkg方式安装,因为依赖处理麻烦。其它的则看哪种方便用哪个,具体按照可以参考我下方示例:
<math xmlns="http://www.w3.org/1998/Math/MathML"> 1 :在 D e b i a n 、 U b u n t u 上安装 E r l a n g : \color{#f00}{1:在Debian、Ubuntu上安装Erlang:} </math>1:在Debian、Ubuntu上安装Erlang:
sh
'Ⅰ:安装通过apt进行下载Erlang'
## 更新当前本地的源列表和官方上的一致
sudo apt-get update
## 下载并安装Erlang环境
sudo apt-get install erlang
# 最终完成打印大概如下(Ubuntu下成功打印):
# ...
# User sessions running outdated binaries:
# ubuntu @ session #4: sshd[7049]
# ubuntu @ user manager service: systemd[7056]
# No VM guests are running outdated hypervisor (qemu) binaries on this host.
# 最终完成打印如下(Debian下成功打印):
# ...
# done.
# Setting up default-jre-headless (2:1.17-74) ...
# Setting up erlang-jinterface (1:25.2.3+dfsg-1) ...
# Processing triggers for libgdk-pixbuf-2.0-0:amd64 (2.42.10+dfsg-1+deb12u1) ...
'安装成功后打印版本如下:'
在Debian 12 中大概打印:25.2.3 --> 推荐的RabbitMQ版本:3.12.x ~ 3.11.x
在Ubuntu 24.04 中大概打印:25.3.2.8 --> 推荐的RabbitMQ版本:3.12.x ~ 3.11.x
点开查看详情:关于Debian、Ubuntu系统的包管理器的源地址切换(下载安装失败时处理一下)
cpp
'无法下载则需更换镜像源URL说明'
'注:更换源以后一定要执行如下两行命令'
## 用于更新软件包索引,不会安装或升级软件包
sudo apt update
## 用于升级已安装的软件包到最新版本,但不会处理新的依赖关系
sudo apt upgrade
'按照不同的系统更换源'
1:若是Ubuntu 24.04(LTS)更换第三方镜像
## 修改apt源配置文件
sudo vim /etc/apt/sources.list.d/ubuntu.sources
## 注释默认官方的镜像源并添加如下镜像源
## 阿里源
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
2:若是Debian 12 更换第三方镜像
## 修改apt源配置文件
sudo vim /etc/apt/sources.list
## 阿里云源
deb https://mirrors.aliyun.com/debian/ bookworm main non-free non-free-firmware contrib
deb-src https://mirrors.aliyun.com/debian/ bookworm main non-free non-free-firmware contrib
deb https://mirrors.aliyun.com/debian-security/ bookworm-security main
deb-src https://mirrors.aliyun.com/debian-security/ bookworm-security main
deb https://mirrors.aliyun.com/debian/ bookworm-updates main non-free non-free-firmware contrib
deb-src https://mirrors.aliyun.com/debian/ bookworm-updates main non-free non-free-firmware contrib
deb https://mirrors.aliyun.com/debian/ bookworm-backports main non-free non-free-firmware contrib
deb-src https://mirrors.aliyun.com/debian/ bookworm-backports main non-free non-free-firmware contrib
3:Erlang官方推荐的源地址修改操作(官方教程,不推荐,国内的有时候一样连不上他们服务器下载)
## 修改apt镜像源
sudo vim /etc/apt/sources.list
## 将如下地址添加到如上文件内
deb http://binaries2.erlang-solutions.com/ubuntu/ jammy-esl-erlang-25 contrib
deb http://binaries2.erlang-solutions.com/debian/ bullseye-elixir-1.15 contrib
deb http://binaries2.erlang-solutions.com/ubuntu/ bionic-mongooseim-6 contrib
## 添加公钥并安装(这可以验证通过erlang官方来的镜像是否可以通过公钥验证)
wget https://binaries2.erlang-solutions.com/GPG-KEY-pmanager.asc
sudo apt-key add GPG-KEY-pmanager.asc
<math xmlns="http://www.w3.org/1998/Math/MathML"> 2 :在 C e n t o s 、 R e d H a t 上安装 E r l a n g : \color{#f00}{2:在Centos、RedHat上安装Erlang:} </math>2:在Centos、RedHat上安装Erlang:
sh
'使用 rpm 在Centos上安装Erlang环境(离线方式安装、极力推荐!!!)'
'这种方式是RabbitMQ提供了一个零依赖Erlang/OTP,可以按照不同的RedHat阵营的Linux安装'
'需要啥版本去这里点Tags标签后点击版本号下载指定包:https://github.com/rabbitmq/erlang-rpm/releases'
'高版本的安装包已经慢慢不支持Centos7系统了'
'提供的Erlang安装包一些版本说明(aarch64的是arm架构,就是移动端)'
'这里的rpm安装包一定要根据el7~9安装到对应的Centos系统版本里,否则大概率安装时找不到必要依赖!'
erlang-27.3.4-1.el7.x86_64.rpm:提供PC端如RedHat7和Centos7安装的版本
erlang-27.3.4-1.el8.x86_64.rpm:提供PC端如RedHat8和Centos Stream8安装的版本
erlang-27.3.4-1.el9.x86_64.rpm:提供PC端如RedHat9和Centos Stream9安装的版本
Ⅰ:下载对应版本并上传到服务器(这里我就以Centos7演示)
erlang-27.3.4-1.el7.x86_64.rpm
Ⅱ:安装对应的rpm包
rpm -ivh erlang-27.3.4-1.el7.x86_64.rpm
Ⅲ:查看是否安装
rpm -q erlang-27.3.4-1.el7.x86_64
Ⅳ:卸载安装的Erlang
rpm -evh erlang-27.3.4-1.el7.x86_64
-------------------------------------------------------------------------------------------
'使用 yum 安装Erlang环境(不推荐)'
yum方式安装已经不被推荐了,而且官方也只提供rpm方式供我们安装了;所以推荐使用上面的rpm方式安装。
安装成功后打印版本如下:
在Centos7中使用rpm安装啥版本,打印就是啥版本
(二):基于源码包编译安装
这种方式就略微有点复杂咯,我反正不推荐,但使用这种方式可以体验到最新版的Erlang安装,换来的是安装过程中会有头疼的依赖问题处理哟。我下面说的这种编译安装在Debian、Ubuntu、RedHat、Centos的操作都是一样的。
注:RedHat阵营不建议使用这种方式 ,因为RabbitMQ官方提供了 erlang-rpm 的包下载可以直接安装,无需编译就可体验最接近新版的Erlang,请参考上方的RedHat和Centos基于包管理器安装操作。
Erlang源码包下载地址:
github.com/erlang/otp/...
sh
'必要的依赖处理!!!'
'注:Ubuntu和Debian发行版系统需要执行如下编译程序依赖下载(若使用的镜像源找不到依赖,则使用官方镜像源):'
sudo apt install -y build-essential libssl-dev unixodbc-dev libncurses5-dev pkg-config
sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev libwxgtk3.2-dev
## 说明:
build-essential内部包含:gcc、g++、make、dpkg-dev、libc6-dev、binutils
libssl-dev内部包含:openssl、openssl-devel
unixodbc-dev内部包含:unixODBC、unixODBC-devel
libncurses5-dev内部包含:ncurses-devel
'注:RedHat和Centos发行版系统需要执行如下编译程序依赖下载:'
sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel unixODBC-devel ncurses-devel
sudo yum install -y pkgconfig mesa-libGL-devel mesa-libGLU-devel wxGTK3-devel
# 说明:groupinstall是安装CentOS(或RHEL)系统中用于一次性安装常用开发工具包的命令。
# 包括命令如下:
# gcc、g++、make、autoconf、automake、binutils、libtool、patch、rpm-build、strace、ltrace..
-------------------------------------------------------------------------------------------
'编译Erlang正式开始!!!'
'Ⅰ:下载自己需要的Erlang对应的tar.gz包(找到并下载:Source code(tar.gz))'
## 这里我下载的是:OTP-27.3.4.1;下载好上传到Linux目录中
## 或使用下面的wget命令直接下载(不推荐,自己本地科学上网直接下载完传到Linux上快些)
wget https://github.com/erlang/otp/archive/refs/tags/OTP-27.3.4.1.tar.gz
ls
## 打印
OTP-27.3.4.1.tar.gz
'Ⅱ:解压下载的tar包并进入'
sudo tar -zxvf OTP-27.3.4.1.tar.gz
cd otp-OTP-27.3.4.1
'Ⅲ:配置安装路径(prefix代表安装的路径)'
sudo mkdir -p /usr/local/erlang
sudo ./configure --prefix=/usr/local/erlang --without-jinterface
## 说明1:
# --without-jinterface说明:跳过jinterface模块的安装。
# jinterface是Erlang提供的用于Java与Erlang节点通信的模块。
# 由于本次安装Erlang是用于部署RabbitMQ,而RabbitMQ并不依赖该模块,因此可以安全跳过。
# ./configure后会打印日志:
# jinterface : No Java compiler found
# jinterface : User gave --without-jinterface option
## 说明2:
# 注:若打印如下日志则不必在意:
# wx: wxWidgets was not compiled with --enable-webview or wxWebView
# developer package is not installed, wxWebView will NOT be available
# 说明:我们系统安装的wxWidgets库(用于图形界面),没有启用webview功能,所以wxWebView组件不可用。
# 我们RabbitMQ是后台服务,不使用GUI,也不用wxWebView,这个功能根本不会用到。
### 出现如下日志一般代表成功了:
# checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... yes
# checking if we can add -Werror=return-type to CXXFLAGS (via CFLAGS)... yes
# configure: creating x86_64-pc-linux-gnu/config.status
# config.status: creating config.mk
# config.status: creating c_src/Makefile
### 比如我这里就打印如下内容:
# configure: creating x86_64-pc-linux-gnu/config.status
# config.status: creating config.mk
# config.status: creating c_src/Makefile
# *********************************************************************
# ********************** APPLICATIONS DISABLED **********************
# *********************************************************************
# jinterface : No Java compiler found
# jinterface : User gave --without-jinterface option
# *********************************************************************
# *********************************************************************
# ********************** APPLICATIONS INFORMATION *******************
# *********************************************************************
# wx : wxWidgets was not compiled with --enable-webview or wxWebView developer
# package is not installed, wxWebView will NOT be available
# *********************************************************************
#### 注意:在不同系统的日志打印可能不一样,因为系统的环境不一样,正常./configure完成后就去make安装
#### 如果make安装时报Error,那大概率就是./configure有问题或者就是安装时缺依赖。
'Ⅳ:安装Erlang(make:编译;make install:安装; &&:前面的命令执行成功后面的命令才会执行)'
sudo make && sudo make install
## 打印如下代表成功(如果未通过也有可能是编译可能不对)
# ...
# ln -s ../lib/erlang/bin/dialyzer dialyzer
# ln -s ../lib/erlang/bin/typer typer
# ln -s ../lib/erlang/bin/escript escript
# ln -s ../lib/erlang/bin/ct_run ct_run
'Ⅴ:配置Erlang环境变量并刷新(往/etc/profile最后一行写入配置)'
echo '# Erlang环境变量配置' | sudo tee -a /etc/profile
echo 'export PATH=$PATH:/usr/local/erlang/bin' | sudo tee -a /etc/profile
source /etc/profile
## 说明:tee -a 会以root权限追加内容到文件,不会因为重定向权限问题失败。
'Ⅵ:检查Erlang环境是否安装'
erl
## 打印如下(Ubuntu方式安装后打印)
Erlang/OTP 27 [erts-15.2.7][source][64-bit][smp:128:8][ds:128:8:10][async-threads:1][jit:ns]
Eshell V15.2.7 (press Ctrl+G to abort, type help(). for help)
## 打印如下(Centos方式安装后打印)
Erlang/OTP 27 [erts-15.2.7] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]
Eshell V15.2.7 (press Ctrl+G to abort, type help(). for help)
四:安装RabbitMQ消息队列
上面安装了Erlang后就可以安装RabbitMQ服务了,关于RabbitMQ版本需要严格按照官网上提供的说明,否则安装会报各种错误,下面我就根据我安装的Erlang版本选择了合适的RabbitMQ进行安装。
RabbitMQ包下载地址:github.com/rabbitmq/ra...
sh
'下载对应RabbitMQ对应步骤:https://github.com/rabbitmq/rabbitmq-server/releases'
1:点击RabbitMQ服务下载地址后点击Tags标签;
2:选择一个和自己安装的Erlang兼容的MQ版本后点击版本号进入;
3:拉到最下方后关于下载的包说明(这里我以4.1.2做个说明):
rabbitmq-server-4.1.2.exe ==》提供Windows的安装包
rabbitmq-server_4.1.2-1_all.deb ==》提供Debian、Ubuntu全版本的安装包
rabbitmq-server-4.1.2-1.el8.noarch.rpm ==》提供RedHat8、Centos8版本的安装包(若是el7则是7版本)
rabbitmq-server-generic-unix-4.1.2.tar.xz ==》通用二进制编译版本(适合各种uninx环境,已gcc编译)
'关于Centos7和RedHat7下载说明:'
高版本的RabbitMQ服务已经不在支持el7版本了;
所以下载的时候尽量要选择和自己系统版本一致才行,否则可能会出问题。
# 由于我不想降Erlang版本到23,所以我将el8的安装包放到Centos7上安装测试没出现问题(不推荐)
Centos7和RedHat7指定的可以选择3.9.16的RabbitMQ服务,与此同时Erlang需要降到23版本咯。
(一):基于包方式安装
如果Erlang采用的基于包管理器安装(yum
、apt
)的话 ,在这里推荐使用这个包方式安装RabbitMQ服务,若不小心使用这种方式安装报错了,需要卸载安装报错的rabbit-server。
rpm -evh rabbitmq-server --RedHat、Centos方式卸载RabbitMQ
apt-get remove --purge rabbitmq-server --Ubuntu、Debian方式卸载RabbitMQ
sh
'注意:采用yum或apt方式安装的Erlang版本普遍会很低;一定要选择对应版本的RabbitMQ版本安装包!!'
'Ⅰ:在Debian、Ubuntu上安装RabbitMQ:'
# 下载对应的Ubuntu或者Debian需要的RabbitMQ版本并上传(一定要核对兼容版本!)
# 比如在Ubuntu 24.4(LTS)中通过apt安装的Erlang版本为25.3.2.8,
# 我们下载的rabbitmq-server版本最高只能为3.12.13(具体看官网的更新及适配)
sudo dpkg -i rabbitmq-server_3.12.13-1_all.deb
'说明:请下载deb后缀的安装包!'
'Ⅱ:在Centos、RedHat上安装RabbitMQ:'
# 下载对应的RedHat或者Centos需要的RabbitMQ版本并上传(一定要核对兼容版本!)
# 我安装的Erlang版本为27.3.4;所以我对应的 rabbitmq-server-4.1.2是没问题的
# 我在Centos7安装el8版本的包目测没问题,但在生产环境就不推荐。
sudo rpm -ivh rabbitmq-server-4.1.2-1.el8.noarch.rpm
'说明:请下载rpm后缀的安装包!'
(一):基于源码方式安装
如果Erlang采用的基于源码包编译安装的话,在这里推荐使用这个源码方式安装RabbitMQ服务。需要下载对应的源码包。
sh
'我以4.1.2版本介绍,下载时有如下两种类型已编译的二进制源码包'
rabbitmq-server-generic-unix-4.1.2.tar.xz (本小节我以这个包为例)
rabbitmq-server-generic-unix-latest-toolchain-4.1.2.tar.xz
## "generic-unix"代表通用Linux版,在任意Linux下都可以正常使用。
## "latest-toolchain"内部包含了最新工具链(编译器、链接器、库...)的包,通常用于开发者。
## 上面的这两个都是官方通过gcc编译过的,无需再次编译了,可直接使用。
'第一步:依赖环境安装!!重要!!'
## Debian和Ubuntu环境里执行如下依赖下载命令
sudo apt install -y socat logrotate init-system-helpers adduser
## RedHat和Centos环境里执行如下依赖下载命令
sudo yum install -y socat logrotate
## 依赖说明:
socat:多功能的网络工具,它可以创建双向数据通道,支持多种协议(如 TCP、UDP、UNIX 域套接字等)。
用于将数据从一个端口转发到另一个端口,或者在不同的网络协议之间进行转换。
logrotate:用于管理日志文件的工具,可以自动轮换、压缩、删除和邮件发送日志文件。
用于通过定期轮换日志文件,防止日志文件占用过多磁盘空间,并保持系统的整洁。
init-system-helpers:是一个提供初始化系统(如 systemd、SysVinit 等)相关功能的库。
帮助其他软件包与系统的初始化系统进行交互,简化服务的启动、停止和管理。
adduser:用于创建新用户的命令行工具。提供了简单的界面来添加用户,并可以设置用户的家目录、默认组等。
用于在系统中添加新用户,通常在系统管理和用户管理中使用。
'第二步:解压安装包并编译安装'
'Ⅰ:下载安装包并上传到服务器任意位置'
ls
## 打印
rabbitmq-server-generic-unix-4.1.2.tar.xz
'Ⅱ:解压刚才下载的源码编译包(需要解压两次!)'
xz -d rabbitmq-server-generic-unix-4.1.2.tar.xz
tar -xvf rabbitmq-server-generic-unix-4.1.2.tar
'Ⅲ:剪贴到规范目录位置,并配置环境变量(往/etc/profile最后一行写入配置)'
sudo mv rabbitmq_server-4.1.2 /usr/local/
echo '# RabbitMQ环境变量配置' | sudo tee -a /etc/profile
echo 'export PATH=$PATH:/usr/local/rabbitmq_server-4.1.2/sbin' | sudo tee -a /etc/profile
source /etc/profile
'[到这里就安装完成了,具体参考后面一节的RabbitMQ的服务启动和使用吧]'
五:RabbitMQ服务启动访问
到这里我们可算将RabbitMQ服务安装完毕了,下面就需要说说RabbitMQ如何启动、如何开启Web面板、如何构建用户和远程Web界面访问了,话不多说开整。
(一):RabbitMQ服务启停
启停命令分别为systemctl命令
和RabbitMQ自带脚本命令
这两种方式,下面将通过如下两种方式来进行RabbitMQ服务的管理。
sh
'第一种方式:通过systemctl命令(只有通过rpm、dpkg方式安装的RabbitMQ才可以使用如下方式!!)'
sudo systemctl status rabbitmq-server # 查看RabbitMQ服务状态
sudo systemctl start rabbitmq-server # 启动RabbitMQ服务
sudo systemctl stop rabbitmq-server # 关闭RabbitMQ服务
sudo systemctl restart rabbitmq-server # 重启RabbitMQ服务
sudo systemctl enable rabbitmq-server # 设置开机自启
sudo systemctl disable rabbitmq-server # 关闭开机自启
'第二种方式:通过RabbitMQ自带脚本命令(都可使用,若找不到命令则需要配置RabbitMQ环境变量!!)'
rabbitmq-server -detached # 启动RabbitMQ(后台运行,非交互式)
rabbitmq-server start # 启动RabbitMQ
rabbitmqctl stop # 关闭RabbitMQ
chkconfig rabbitmq-server on # 设置开机自启(Centos、RedHat可用)
chkconfig rabbitmq-server off # 关闭开机自启(Centos、RedHat可用)
(二):Web插件管理
RabbitMQ提供了一个Web管理插件,允许用户通过浏览器管理RabbitMQ服务器。就要启用Web管理插件。完成如下步骤操作就可以通过Web页面进行访问了,需要注意的是检查:端口、防火墙或云防火墙、服务是否启动等,完成后就可以正常访问:http://localhost:15672
sh
'Ⅰ:查看RabbitMQ自带插件列表(展示部分)'
rabbitmq-plugins list
## 如下打印([ ]里选中则代表开启):
# ...
# [ ] rabbitmq_management 4.1.2 【web管理插件,允许用户通过浏览器管理RabbitMQ实例】
# [ ] rabbitmq_management_agent 4.1.2 【web管理增强插件,用于增强RabbitMQ管理功能的代理】
# [ ] rabbitmq_web_dispatch 4.1.2 【支持RabbitMQ Web管理界面的路由和分发】
'Ⅱ:开启RabbitMQ的Web插件'
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list
## 如下打印:
# ...
# [E*] rabbitmq_management 4.1.2
# [e*] rabbitmq_management_agent 4.1.2
# [e*] rabbitmq_web_dispatch 4.1.2
## 补充(关闭如Web插件)
## rabbitmq-plugins disable rabbitmq_management
'Ⅲ:开启Web管理接口应用的操作(千万别忘记!)'
# 虽然插件开启了,但是这个Web服务是未启动的,通过如下进行开启和关闭
rabbitmqctl stop_app # 停止web页面
rabbitmqctl start_app # 启动web页面(默认是启动状态)
'RabbitMQ页面地址:(需要开启15672端口哟)'
http://localhost:15672/
如下账号密码只能在localhost环境下访问,否则无法登录(下面一节设置权限)。
默认账号:guest 默认密码:guest
(三):基本用户创建
到这一步就代表之前的操作都已经完成了,现在需要创建一个用户来更好的通过非本地访问Web界面,以及在Web界面中进行一些服务的配置和管理,下面就随着我一起操作看看。
sh
'快速创建一个可以非本地访问的Web界面的超级管理员(这些命令后面会进行说明)'
# 创建用户名和密码
rabbitmqctl add_user admin 1234
# 将admin用户的角色设置超级管理员
rabbitmqctl set_user_tags admin administrator
# 将admin用户设置vhost为'/',并设置全部文件的读写操作
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
'注:后期我们一般是通过Web界面进行用户创建的,这个知道即可。'

六:RabbitMQ基本命令使用
(一):用户操作命令(User)
用户(User)是管理和控制访问RabbitMQ资源的基本单位。用户可以被赋予不同的权限,以控制他们对虚拟主机、队列、交换机等资源的访问。
sh
rabbitmqctl add_user [用户名] [密码]
# 创建一个non-administrative用户(非管理员用户)
rabbitmqctl delete_user [用户名]
# 删除一个已经存在的用户。
rabbitmqctl change_password [用户名] [新密码]
# 修改指定的用户密码
rabbitmqctl clear_password [用户名]
# 清除指定用户的密码。
# 该命令会将用户的密码设置为空,从而导致该用户不能使用密码认证进行登录。
# 但是可能通过已经配置的SASL EXTERNAL的方式登录。
rabbitmqctl authenticate_user [用户名] [密码]
# 验证用户是否具有有效的凭证,它不会更改用户的权限或角色;(验证用户名和密码是否正确存在)
rabbitmqctl list_users
# 列出所有用户名信息
rabbitmqctl list_user_permissions [用户名]
# 列出指定用户的所有权限信息,包括该用户对哪些virtual hosts有权限,以及具体的权限类型。
# configure:配置权限,允许用户创建和修改队列、交换机等。
# read:读取权限,允许用户消费队列中的消息。
# write:写入权限,允许用户向队列中发布消息。
# 如下打印:rabbitmqctl list_user_permissions admin
# vhost configure write read
# / .* .* .*
rabbitmqctl set_user_tags [用户名] [角色 ...]
# 设置用户的角色,可以同时设置多个(空格隔开角色),并且已经存在的tag也将会被移除。
-----------------------------------------------------------------------------------------
'注:关于可以设置的 tag 角色如下:'
'none(其它):'
权限: 无特定权限,不能登录管理控制台(启用了management插件的情况下)。
# 这个角色通常用于不需要管理界面权限的普通用户。
描述: 用户没有任何管理权限,不能访问管理界面。
'management(普通管理者)'
权限:可以执行所有通过AMQP协议允许的操作。还可以如下操作:
1.列出自己能够访问的 virtual hosts。
2.查看自己能访问的 virtual hosts 中的 queues、exchanges 和 bindings。
3.查看和关闭自己的 channels 和 connections。
4.查看关于自己 virtual hosts 的全局统计信息(但不包括其他用户的活动)。
描述:这个角色提供基本的管理权限,允许用户查看、管理自己所能访问的虚拟主机以及一些相关资源。
'policymaker(决策制定者)'
权限:拥有 management 角色的所有权限。还额外有如下权限:
1.查看、创建和删除自己 virtual hosts 上的 policies 和 parameters。
描述:这个角色使用户能够管理与策略(policy)相关的配置,
# 例如应用规则和配置文件,但不会涉及用户和虚拟主机的创建等权限。
'monitor/monitoring(监控者)'
权限:拥有 management 角色的所有权限。还额外有如下权限:
1.列出所有的 virtual hosts,包括那些用户没有权限登录的 virtual hosts。
2.查看其他用户的 connections 和 channels。
3.查看节点级别的数据,如集群状态、内存使用情况等。
4.查看全局的统计信息,涉及所有 virtual hosts,而不仅仅是自己的 virtual hosts。
描述:这个角色赋予用户广泛的监控权限,用户不仅能够查看自己的资源,
还能查看集群中的其他资源以及其他用户的活动。
'administrator(超级管理员)'
权限:拥有 policymaker 和 monitoring 角色的所有权限。还额外有如下权限:
1.创建和删除 virtual hosts。
2.创建、查看、删除用户。
3.创建、查看、删除权限(permissions)。
4.关闭其他用户的 connections。
描述:这是最高权限的角色,具有对 RabbitMQ 集群几乎所有资源的控制权限。
它不仅能够管理用户、虚拟主机和权限,还可以监控集群和控制其他用户的连接。
(二):虚拟主机命令(Vhosts)
虚拟主机(vhosts)是一个重要的概念,它允许在同一RabbitMQ实例中隔离不同的应用程序或环境。通过使用虚拟主机,您可以在同一RabbitMQ服务器上创建多个独立的消息传递环境。
sh
rabbitmqctl list_vhosts
# 列出所有虚拟主机
rabbitmqctl add_vhost <vhost名称>
# 创建一个新的虚拟主机(虚拟主机名称不能包含空格)
rabbitmqctl delete_vhost <vhost名称>
# 删除指定的虚拟主机
# 注:在删除虚拟主机之前,确保该虚拟主机下没有队列、交换机或绑定。
rabbitmqctl list_permissions -p <vhost名称>
# 列出指定虚拟主机上所有用户的权限
'强调说明命令:'
rabbitmqctl set_permissions -p <vhost_name> <user> <configure> <write> <read>
作用:设置虚拟主机的权限,主要是为指定用户在特定虚拟主机上设置权限。
参数:
configure:用户可以配置的资源(如交换机、队列等)的正则表达式。
write:用户可以写入的资源的正则表达式。
read:用户可以读取的资源的正则表达式。
示例:假设现在有个 my_vhost 虚拟主机和 admin 用户来说:
'》【完全访问权限】允许`admin`在`my_vhost`虚拟主机上配置、写入和读取所有资源。'
rabbitmqctl set_permissions -p my_vhost my_user ".*" ".*" ".*"
'》【限制配置权限】允许`admin`在`my_vhost`虚拟主机上配置以`my_`开头的资源,写入和读取所有资源。'
rabbitmqctl set_permissions -p my_vhost my_user "^my_.*" ".*" ".*"
'》【只允许读取特定队列】允许admin在my_vhost虚拟主机上配置和写入所有资源,但只能读取my_queue队列。'
rabbitmqctl set_permissions -p my_vhost my_user ".*" ".*" "^my_queue$"
'》【限制所有权限】禁止`admin`在`my_vhost`虚拟主机上配置、写入和读取任何资源。'
rabbitmqctl set_permissions -p my_vhost my_user "" "" ""