一、概述+ c S" {( N( Y; E
& t! r0 w4 A$ K; s) e
7 a6 O1 }7 g- \RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。# k. a% P% ^: F8 ?7 P% s# |
官网:https://www.rabbitmq.com
0 ^" ?3 E3 E* ]/ r4 o `& e下载:https://github.com/rabbitmq/rabbitmq-server/releases/
# L4 W5 O: n4 f6 \& j- }
: ~- I7 i; J: l! n; I
+ r: A7 p# k6 |7 a. v- N. o
( k4 Y5 F! l: @' X8 Q1 i* N: |+ h( p" t: u3 T! K* x
二、说明
$ N, E0 _0 t$ _8 l& [# b0 h$ R6 j安装RabbitMQ server需要Erlang语言环境,请参考https://www.toutiao.com/i6950544298114859527/,本文中不再赘述安装配置步骤。/ d: T2 H7 ]) o0 b$ g) { e2 d
本文介绍在CentOS7.8 x64(测试服务器IP:192.168.168.100)系统下,使用二进制包及源码包编译安装最新(截止2021年4月14日)版本,版本号为3.8.14。
4 v7 l# n/ Y+ o- x; Q/ ]5 c' l
, F6 k5 O6 d4 E- r
' y: [! k( ~2 A8 p* {2 u( ]
* a" q9 k% I" x& o& c' ]4 N
% Q) s) l0 ?4 k# l( y" k N7 X三、二进制包安装
) P5 O& K# V9 V8 z( _' r1.下载安装
2 z0 N/ Z1 n$ e/ p j! Z5 l( V# e" Tcd /data/toolswget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-generic-unix-3.8.14.tar.xztar xf rabbitmq-server-generic-unix-3.8.14.tar.xzmv rabbitmq_server-3.8.14 /usr/local/cd /usr/localchown -R root.root rabbitmq_server-3.8.14ln -sf rabbitmq_server-3.8.14 rabbitmq
( j8 ~$ ~5 }3 X% }$ {9 v. ?8 B& e: |9 {
2.环境变量配置
* m" }' \* A% `# n" x# Hvi /etc/profile //末尾添加如下内容 n8 {/ F8 O8 ^7 K' O3 t
######SET RabbitMQ Environmentexport PATH=$PATH:/usr/local/rabbitmq/sbin//生效环境变量. E. {7 C: n R* ?
source /etc/profile6 h, i. l4 }% H. h! z5 b( }* g
6 H7 v( G$ o+ f# K( H. L/ i
6 B. o" m# ?' f$ }+ u0 A3 z' F F5 n
四、源码包编译安装. ]1 G$ { s# N4 z; ^1 f1 i7 T
1.依赖安装: {- i5 l. G& K) n/ T4 d" R
①基础依赖% |& s3 u$ _' n; {6 I
yum -y install git libxslt libxslt-devel rsync xmlto zip unzip②动态的功能语言elixir
0 s: C/ D# }) A0 b+ L# [* e4 _+ l官网:https://elixir-lang.org/ & D# E2 S Q$ j! \& i- p, W( ~
Github仓库地址:https://github.com/elixir-lang/elixir
. `+ `) J. \: c7 Zcd /data/toolsgit clone -b v1.11.4 https://github.com/elixir-lang/elixir.gitcd elixirmake clean testmake install
8 a$ C" A. I% k. p" G, g8 }2 S. `- B5 c/ ~
& s7 H% _9 L d' J2.下载编译安装
. u4 Q1 f* B- H- Q5 dcd /data/toolswget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14.tar.xztar xf rabbitmq-server-3.8.14.tar.xzcd rabbitmq-server-3.8.14## 使用make && make install进行编译安装,RabbitMQ会安装到 /usr/local/lib/erlang/lib/rabbitmq_server-x.x.x/,试着修改编译时的参数,都不能达到改变安装目录,最后找到下面方法
3 s9 D' w! m0 `! J8 m## 找到源文件目录下的Makefile文件
{# L% K% V2 _vi Makefile //修改如下配置项6 R: ?3 a- ^- R/ K) o0 g
PREFIX ?= /usr/local WINDOWS_PREFIX ?= rabbitmq-server-windows-$(PROJECT_VERSION)MANDIR ?= $(PREFIX)/share/manRMQ_ROOTDIR ?= $(PREFIX)/lib/erlangRMQ_BINDIR ?= $(RMQ_ROOTDIR)/binRMQ_LIBDIR ?= $(RMQ_ROOTDIR)/libRMQ_ERLAPP_DIR ?= $(RMQ_LIBDIR)/rabbitmq_server-$(PROJECT_VERSION)RMQ_AUTOCOMPLETE_DIR ?= $(RMQ_ROOTDIR)/autocomplete将以上配置项的内容修改为如下内容PREFIX ?= /usr/local/rabbitmq-3.8.14WINDOWS_PREFIX ?= rabbitmq-server-windows-$(PROJECT_VERSION)MANDIR ?= $(PREFIX)/share/manRMQ_ROOTDIR ?= $(PREFIX)RMQ_BINDIR ?= $(RMQ_ROOTDIR)/sbinRMQ_LIBDIR ?= $(RMQ_ROOTDIR)RMQ_ERLAPP_DIR ?= $(RMQ_LIBDIR)RMQ_AUTOCOMPLETE_DIR ?= $(RMQ_ROOTDIR)/autocomplete//再执行编译安装命令9 C6 s: i% ~5 C( v
makemake installcd /usr/local/## 创建软连接,方便管理ln -sf rabbitmq-3.8.14 rabbitmq
, q0 {+ g1 G1 \: Z( b3 G; B1 F1 i: f' O
3.环境变量配置
' o0 R/ L- q$ ~" rvi /etc/profile //末尾添加如下内容
1 l2 k* ?0 h; c- l######SET RabbitMQ Environmentexport PATH=$PATH:/usr/local/rabbitmq/sbin//生效环境变量) U- W! W0 t1 K N, U# u
source /etc/profile: d5 O% i2 f1 d: O
0 A7 ^9 B( a. g6 I" F( U
* U$ U. F# i3 X
" Q P1 _4 T8 q' [' U* }
五、服务管理说明4 \, f2 _% j" _( u; G, q$ F; Z
cd /usr/local/rabbitmq/sbin% K. X9 z" ?, a2 G: }
启动:
" ^. y5 J' A7 W# U7 x./rabbitmq-server -detached
+ T7 c6 p0 z! x" c$ g//参数 -detached 表示后台启动
) ^$ H! k% y @$ H$ @ ./rabbitmq-server start &
7 V' f6 ?7 d$ J! x& _ ./rabbitmq-server &
4 x0 V J2 h5 y Y" Q关闭:./rabbitmqctl stop
* S- M, ?8 ^9 a! J0 q查看服务状态:./rabbitmqctl status
" ~3 Q. F( i4 Z* M; h! ?2 i/ c若已配置环境变量,则不需要进入安装目录,直接运行命令即可启动或关闭服务。
/ G1 S: h, K: Y" \) y" O启动:
( i- ^' a# S9 q' Frabbitmq-server -detached
# {$ l) M! x; B! z6 k//参数 -detached 表示后台启动
% F5 u. J6 B! [$ j/ M: M rabbitmq-server start &
* Z( t+ D z$ ` } rabbitmq-server &
7 c9 f- i! m* T0 A+ w, R关闭:rabbitmqctl stop
) H5 N( H: h* V* e1 |查看服务状态:rabbitmqctl status
( X7 | h# ^+ z; s8 t备注:启动命令后若不加参数 -detached,如使用./rabbitmq-server 或 ./rabbitmq-server start 或 rabbitmq-server 或rabbitmq-server start,会一直显示着启动信息,无法正常退出到命令操作界面,需强制退出当前终端,这样也会关闭rabbitmq服务。" J' {6 R! t. f) ?' G9 [
默认监听端口:5672、25672" u2 Z8 z1 z& q7 _3 n+ z; _2 p
配置开机启动:echo '/usr/local/rabbitmq/sbin/rabbitmq-server &' >> /etc/rc.local: v$ V% w+ Q0 E0 `
8 f: I6 |% Z/ e2 F
& s# G5 K2 ?. T, o
0 f8 p' x9 G7 i8 p: O$ V2 W
! Q0 w: b# A. Z3 g六、插件安装
% |4 N" v a" n* w4 B本文只介绍WEB插件及延时队列的安装步骤,其他插件的安装亦可参考这两个来完成安装。
; A V1 Z2 i- m- E. v( j1.WEB管理: n! q( I' ?" K6 c+ U& ]/ w
①安装+ c {2 g8 A- q
mkdir -p /etc/rabbitmq //此目录必须手动创建,且不能改成别的路径和目录名
2 O( C- v: j+ M8 E. Crabbitmq-plugins enable rabbitmq_management) n0 k* A+ v7 m" ^! L
+ J. {5 a) X4 S1 F4 p
重启RabbitMQ服务
' b% F q, S/ r1 o* j4 ], ^查看启动是否成功: netstat -tunlp | grep beam8 Q ~1 j0 W! x/ T
0 `1 v- U6 y/ _
( Y: Y# v0 c9 j) K8 k, [4 D可以看到启动成功: 15672是rabbimq网页管理监听端口,5672是客户端使用的端口。management UI是static HTML页面,其通过Javascript查询HTTP API得到实时数据。实质上Web UI最终也是调用的Management command line tool。' M8 Z; O4 |: [7 \- w, _
- F! n4 e9 ~( e, G! F0 P
$ w5 @6 ]! V/ e* `: _3 ^: k②添加账号并配置管理权限
, f) T- S1 z) f访问http://ip:15672/,此时默认帐号guest/guest无法登录访问,因为默认的guest账号只能在本地机器访问, 如果想在其它机器访问必须配置其它账号。
5 j1 B; R) }0 Z/ o/ ^( O## 添加帐号rabbitmqctl add_user admin 123456## 赋予管理员权限rabbitmqctl set_user_tags admin administrator## 添加权限rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"9 Y% j6 O! Z' m
2 O- g! b$ S% `7 @- W( [
说明:添加帐号命令执行完成的提示是提醒要给帐号授权。! u i# W/ _# Q- D; _8 b; U
8 `) Z4 k% _* ~# F! ^$ B
! D3 e) U+ L* }③访问WEB页面8 ?# E0 u) j! p8 k6 M( j# a( X- {
地址栏输入:http://ip:15672/,本文为http://192.168.168.100:156722 V5 x5 k& |" o: r, ^! ^3 V* x
注:服务器防火墙开启的状态下需要放开端口,或者关闭防火墙。. i- r5 r2 u8 C) S
9 W9 D4 M9 [- s0 [# J& t$ O2 y% x
: t) y1 U+ H6 F: T2 V
## 输入账号admin,密码123456,登录& F: N+ B2 v6 f' `
2 P' o5 |5 t7 ? K' P& U7 p3 X
$ t6 w, l9 P# R& K8 @2 S |: z
## 登录后,可查看到相关的基础信息
/ A a% |6 n0 K1 K5 D. r$ S, V
( E) E9 n% n5 t# N% a
! U6 ` B, ~3 b④删除guest账户( D* C% u. N0 B6 e. k8 w
rabbitmqctl delete_user guest: I; {$ u( G; X8 ~' c2 g
$ h, s1 r; `6 W, A& W
- V' T1 n- p7 y% _" C0 f. h* U7 K7 M
2.延时消息队列
5 J6 \( B. o: Z# W, Tcd /usr/local/rabbitmq/pluginswget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.8.9/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ezrabbitmq-plugins enable rabbitmq_delayed_message_exchange& n9 V! j) g! e2 s2 o \& L
3 b: o" L7 F8 S" ], [) o( p重启RabbitMQ服务8 {* c3 _8 U8 ^6 |* \& H
; ]" d# s8 s* l- h; J
. F% ]- A$ Y, E# R5 Q2 g" v
3.查看已启用的插件& i7 I7 g5 v' J. k5 u8 {; E) `
rabbitmq-plugins list
7 O+ W/ I2 I6 U. e2 ]
( d) ?4 h* g& Q$ i# X9 E+ g# Y8 E) L. s. H5 s6 t2 ~/ Z
( H* O9 T8 C T5 [" ^. ^6 H+ d% L; }* F# I$ I
7 f: f) Q1 ~9 [( t% b- z& H- \
七、常用功能命令说明
& E! s L' O* |. a* SRabbitMQ服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。$ q$ J7 P) Z, i f6 T3 c4 K7 z1 g
1.服务器启动与关闭
$ Q6 ~5 p: l8 u8 l6 s* m 启动:rabbitmq-server –detached
! R+ F5 z0 M$ ?. i8 d L+ J, I) @ 关闭:rabbitmqctl stop
" r9 P& Y' I: E! {# H 若单机有多个实例,则在rabbitmqctl后加 –n 指定名称
3 y3 p1 m# x6 _- O P" t0 N d' D, ?/ G( u1 ?( }6 h6 X( @
8 T2 i- H, v) L9 B* z; Y& [" h2.插件管理9 k" f( `4 t2 f2 L& F. D S
开启某个插件:rabbitmq-plugins enable xxx1 M7 @4 n1 j( s3 J- b
关闭某个插件:rabbitmq-plugins disable xxx% Z/ L: n" y- d: g' j
查看已经安装的插件:rabbitmq-plugins list9 ?* D& [; t8 u4 }
注意:重启服务器后生效。1 P* b. P3 a2 |: J: P( C
启用监控插件:./rabbitmq-plugins enable rabbitmq_management4 A- N4 _6 K: l1 v9 l
关闭监控插件:./rabbitmq-plugins disable rabbitmq_management/ l- h/ v& T; Y+ z9 Y. N
6 b: K6 y. P& h
3 N+ Y& b" H9 b3.virtual_host管理 y8 d) a! R* r. Y3 ?
新建virtual_host:rabbitmqctl add_vhost xxx. T9 a2 ?* B& d# r+ Q* e+ S
撤销virtual_host:rabbitmqctl delete_vhost xxx
/ J- g4 \; Y% M7 N) N, g: \
/ [+ f9 @8 G& v& t' W7 p' H( j4 L) a# n8 q5 T+ L# w
4.用户管理: A0 |; [# }7 a. X( b Z
新建用户:rabbitmqctl add_user {username} {password}) s6 C: r% z' E# U9 u2 z# i
删除用户:rabbitmqctl delete_user {username}5 G8 ^7 M6 t. S7 l, c
改密码:rabbimqctl change_password {username} {newpassword}2 R( N0 f- }" [ H% T3 C; j
设置用户角色:rabbitmqctl set_user_tags {username} {tag ...}% Y1 o8 n+ y1 u. q- m+ `% V
Tag可以为 administrator,monitoring, management
, k3 b7 m" ~( K% w! [7 s 查看当前用户列表:rabbitmqctl list_users
6 ]# C* W: c) S, E 赋予超级管理员权限:rabbitmqctl set_user_tags newuser administrator
% I& F# w8 ~/ c- O; \% J8 r" q( e6 J( d0 R5 k0 S
8 }8 G5 ?" ^) A" s5 L5. 权限管理) f G' g: d& k3 p' g, u$ S" ?4 O: W
权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
( r! m7 l7 ?) E2 l( h7 b7 k
* e7 P7 i% Z, l4 b7 Y6 X8 Q! w9 b$ s5 P+ i0 I0 x
参数说明:+ z4 C/ c' d0 h) N/ ~0 C& ?: D& u
Vhostpath: Vhost路径% J4 g& x* E! [3 f$ T9 `* K
user: 用户名
6 L! ~1 d3 {$ Q/ z; F Conf: 一个正则表达式match哪些配置资源能够被该用户访问。
6 p6 k2 X! }7 o# j2 W$ M8 S; L Write: 一个正则表达式match哪些配置资源能够被该用户读。! u$ v5 G7 H6 F' A
Read:一个正则表达式match哪些配置资源能够被该用户访问。* A" g2 v9 G) Q/ n$ ~' }* `
8 \$ r! {. I- J1 d0 t7 P5 }- E/ R2 N9 T" X9 J+ ?$ k& ^8 y
6. 获取服务器状态信息" C; p8 a* L2 V! ]& m' ]
服务器状态:rabbitmqctl status
0 u: h& _9 Z9 g( w4 E 队列信息:rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...]3 G- ]6 f6 Q6 g0 {$ b% ?
Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,$ O; x2 L& K/ N: x* h; n
messages_unacknowledged,messages,consumers,memory
, k. N. h! G. ]( U- f/ m6 y Exchange信息:rabbitmqctl list_exchanges[-p vhostpath] [exchangeinfoitem ...]# F- A, f7 N; }0 }- O. {
Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.! ?" X. r! j3 E# {
Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem ...]
/ }0 r7 Q4 ]! E" ^ Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments: b% E* w, E R. B
Connection信息:rabbitmqctllist_connections [connectioninfoitem ...]: @4 x" a0 V4 d8 A- @0 g
Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。$ z/ @( t3 ?7 Q5 @8 ]' x$ W2 \4 E. f
Channel信息:rabbitmqctl list_channels[channelinfoitem ...]
. |' i, ^$ L" }2 ~+ { S Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked |