三、RabbitMQ安装
安装前准备
Linux版本信息:
- 发行版本:CentOS Linux release 7.5.1804 (Core)
- 内核版本:Linux version 3.10.0-862.el7.x86_64
所需软件:
- Erlang版本:erlang-19.3.6.12-2.el7.centos.x86_64.rpm 下载地址
- RabbitMQ版本:rabbitmq-server-3.6.16.rc.1-1.el7.noarch.rpm 下载地址
安装Erlang
因为RabbitMQ是由Erlang语言编写的,因此在使用RabbitMQ之前需要安装受支持的Erlang版本,在CentOS上,Erlang包有三种常用的源
- RabbitMQ提供的被剥离的包,只提供运行RabbitMQ所需的组件,官方称零依赖项,容易安装,如果Erlang只是用来提供运行RabbitMQ的,推荐使用。
- Erlang官方提供的包,安装时需要安装依赖多,如果还需要Erlang做相关开发或运行环境,使用该包
- EPEL源提供的包,但该包版本过低,不使用该方法下载安装
因为只是使用Erlang运行RabbitMQ,所有下面的学习使用RabbitMQ提供的包。二进制rpm包可以从Bintray和GitHub获得,选择你需要相应的版本下载。
下载完成,安装
[hayson@localhost ~]$ rpm -ivh erlang-19.3.6.12-2.el7.centos.x86_64.rpm
警告:erlang-19.3.6.12-2.el7.centos.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:erlang-19.3.6.12-2.el7.centos ################################# [100%]
如果提示需要相关依赖,是因为该软件包故意不包括OpenSSL/libcrypto。需要单独提供,最近的Erlang版本需要较新的OpenSSL版本,例如1.0.1
。一般安装了SSH后,都安装了。我安装的CentOS已安装有,所以没提示。
测试是否安装完成,输入下面命令
[hayson@localhost ~]$ erl
Erlang/OTP 19 [erts-8.3.5.6] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.3.5.6 (abort with ^G)
1>
进入了Eshell,说明安装完成并正确启动,输出了Erlang的版本号、Eshell版本号等信息。
退出Eshell输入halt().
。
使用了RabbitMQ提供Erlang的rpm包,方便快捷地安装Erlang,省略了Erlang官方提供的源码编译和环境变量设置。
安装RabbitMQ
官方文档提供多种安装方法,本人下载rpm软件包并手动安装。RabbitMQ软件包可以从Github选择版本下载。
安装RabbitMQ
[hayson@localhost ~]$ sudo rpm -ivh rabbitmq-server-3.6.16.rc.1-1.el7.noarch.rpm
[sudo] hayson 的密码:
警告:rabbitmq-server-3.6.16.rc.1-1.el7.noarch.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
错误:依赖检测失败:
socat 被 rabbitmq-server-3.6.16~rc.1-1.el7.noarch 需要
安装时提示缺少socat
依赖,如果CentOS不能联网,可以通过该站点下载socat
包进行安装。我这里直接yum下载
查看仓库中是否有socat
[hayson@localhost ~]$ yum list | grep socat
socat.x86_64 1.7.3.2-2.el7 base
安装socat
[hayson@localhost ~]$ yum install socat
重新安装RabbitMQ
[hayson@localhost ~]$ sudo rpm -ivh rabbitmq-server-3.6.16.rc.1-1.el7.noarch.rpm
准备中... ################################# [100%]
正在升级/安装...
1:rabbitmq-server-3.6.16~rc.1-1.el7################################# [100%]
RabbitMQ安装成功
启动RabbitMQ
[hayson@localhost ~]$ sudo rabbitmq-server
RabbitMQ 3.6.16-rc.1. Copyright (C) 2007-2018 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit@localhost.log
###### ## /var/log/rabbitmq/rabbit@localhost-sasl.log
##########
Starting broker...
completed with 0 plugins.
可以看到RAbbitMQ启动成功,并输出RabbitMQ版本、日志路径和开启插件数(安装默认不开启),Ctrl+C
停止运行。
systemd使用
使用rpm包安装RabbitMQ的好处是,安装后默认配好了快捷启动、停止、运行状态、失败重启等设置的systemd
。
-
RabbitMQ运行
启动RabbitMQ
[hayson@localhost ~]$ sudo systemctl start rabbitmq-server
停止RabbitMQ
[hayson@localhost ~]$ sudo systemctl stop rabbitmq-server
查看RabbitMQ状态
[hayson@localhost ~]$ sudo systemctl status rabbitmq-server
-
设置开机系统引导时,运行RabbitMQ
开启
[hayson@localhost ~]$ sudo systemctl enable rabbitmq-server Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
关闭
[hayson@localhost ~]$ sudo systemctl disable rabbitmq-server Removed symlink /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service.
查看状态
[hayson@localhost ~]$ sudo systemctl is-enabled rabbitmq-server disabled
RabbitMQ参数设置
RabbitMQ带有默认的内置设置。在某些环境(例如开发和QA)中,这些可能完全足够。对于所有其他情况以及生产部署调优,我们需要配置一些参数区分于默认的配置。
比如rabbitmq的默认端口是5672,如何去修改端口5672为5673呢?
RabbitMQ提供了三种自定义服务器的通用方法:
配置文件
以修改RabbitMQ默认端口5672
为例。修改端口5672
为5673
-
默认配置文件(强烈不推荐修改默认配置文件)
RabbitMQ的默认配置文件是RabbitMQ的内置默认值,不建议修改,位于
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin
下,打开文件[hayson@localhost ~]$ sudo vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin/rabbit.app
可以看到如下内容(这里截取部分)
{env, [ {tcp_listeners, [5672]}, {default_user, <<"guest">>}, {default_pass, <<"guest">>}, {default_user_tags, [administrator]}, {default_vhost, <<"/">>}, {default_permissions, [<<".*">>, <<".*">>, <<".*">>]}, {loopback_users, [<<"guest">>]},
上面部分显示的配置为:当前RabbitMQ的端口号
5672
,默认用户和密码都为guest
,身份为管理员,默认虚拟主机为/
,权限为拥有所有权限,登录权限只能localhost
或127.0.0.1
。如果要修改端口5672
为5673
,则只需把5672
改为5673
。其他修改用户名或密码把原来修改即可。 -
自定义配置文件
通过查看服务状态
[hayson@localhost ~]$ sudo systemctl status rabbitmq-server
可以看到Logs文件位置,打开该文件位置日志文件
[hayson@localhost ~]$ cat /var/log/rabbitmq/rabbit@localhost.log
这里显示的是没有找到配置文件,我们可以自己创建这个文件
[hayson@localhost ~]$ sudo vim /etc/rabbitmq/rabbitmq.config
写入如下内容
[{rabbit, [
{tcp_listeners,[5673]}
]
}
].
保存配置后重启服务
[hayson@localhost ~]$ sudo systemctl stop rabbitmq-server
[hayson@localhost ~]$ sudo systemctl start rabbitmq-server
官网提供了一份rabbitmq.config示列,此示例文件包含设置的大多数配置项(省略一些非常模糊的配置)以及这些设置的文档的示例。 所有配置项都在示例中注释掉,因此您可以取消注释所需的内容。请注意,不要将其当作一般的推荐配置。
开启web界面管理插件
安装RabbitMQ后,默认不开启任何插件的,需要我们手动去开启,管理插件的命令为rabbitmq-plugins
,可以先查看该命令用法
rabbitmq-plugins用法
[hayson@localhost ~]$ sudo rabbitmq-plugins
Usage:
rabbitmq-plugins [-n <node>] <command> [<command options>]
Commands:
list [-v] [-m] [-E] [-e] [<pattern>]
enable [--offline] [--online] <plugin> ...
disable [--offline] [--online] <plugin> ...
set [--offline] [--online] <plugin> ...
-
查看
RabbitMQ
所有可开启插件[hayson@localhost ~]$ sudo rabbitmq-plugins list Configured: E = explicitly enabled; e = implicitly enabled | Status: * = running on rabbit@localhost |/ [ ] amqp_client 3.6.16-rc.1 [ ] cowboy 1.0.4 [ ] cowlib 1.0.2 [ ] rabbitmq_amqp1_0 3.6.16-rc.1 [ ] rabbitmq_auth_backend_ldap 3.6.16-rc.1 [ ] rabbitmq_auth_mechanism_ssl 3.6.16-rc.1 [ ] rabbitmq_consistent_hash_exchange 3.6.16-rc.1 [ ] rabbitmq_event_exchange 3.6.16-rc.1 [ ] rabbitmq_federation 3.6.16-rc.1 [ ] rabbitmq_federation_management 3.6.16-rc.1 [ ] rabbitmq_jms_topic_exchange 3.6.16-rc.1 [ ] rabbitmq_management 3.6.16-rc.1 [ ] rabbitmq_management_agent 3.6.16-rc.1 [ ] rabbitmq_management_visualiser 3.6.16-rc.1 [ ] rabbitmq_mqtt 3.6.16-rc.1 [ ] rabbitmq_random_exchange 3.6.16-rc.1 [ ] rabbitmq_recent_history_exchange 3.6.16-rc.1 [ ] rabbitmq_sharding 3.6.16-rc.1 [ ] rabbitmq_shovel 3.6.16-rc.1 [ ] rabbitmq_shovel_management 3.6.16-rc.1 [ ] rabbitmq_stomp 3.6.16-rc.1 [ ] rabbitmq_top 3.6.16-rc.1 [ ] rabbitmq_tracing 3.6.16-rc.1 [ ] rabbitmq_trust_store 3.6.16-rc.1 [ ] rabbitmq_web_dispatch 3.6.16-rc.1 [ ] rabbitmq_web_mqtt 3.6.16-rc.1 [ ] rabbitmq_web_mqtt_examples 3.6.16-rc.1 [ ] rabbitmq_web_stomp 3.6.16-rc.1 [ ] rabbitmq_web_stomp_examples 3.6.16-rc.1 [ ] sockjs 0.3.4
上面命令列出了RabbitMQ所有的插件,前面的中括号
[ ]
表示空为没有开启,其中rabbitmq_management
是web界面管理插件 -
开启
rabbitmq_management
插件[hayson@localhost ~]$ sudo rabbitmq-plugins enable rabbitmq_management The following plugins have been enabled: amqp_client cowlib cowboy rabbitmq_web_dispatch rabbitmq_management_agent rabbitmq_management Applying plugin configuration to rabbit@localhost... started 6 plugins.
可以看到共开启了
6
个插件。再次查看插件列表,前面中括号[ ]
出现e*
标记表示开启[hayson@localhost ~]$ sudo rabbitmq-plugins list Configured: E = explicitly enabled; e = implicitly enabled | Status: * = running on rabbit@localhost |/ [e*] amqp_client 3.6.16-rc.1 [e*] cowboy 1.0.4 [e*] cowlib 1.0.2 [ ] rabbitmq_amqp1_0 3.6.16-rc.1 [ ] rabbitmq_auth_backend_ldap 3.6.16-rc.1 [ ] rabbitmq_auth_mechanism_ssl 3.6.16-rc.1 [ ] rabbitmq_consistent_hash_exchange 3.6.16-rc.1 [ ] rabbitmq_event_exchange 3.6.16-rc.1 [ ] rabbitmq_federation 3.6.16-rc.1 [ ] rabbitmq_federation_management 3.6.16-rc.1 [ ] rabbitmq_jms_topic_exchange 3.6.16-rc.1 [E*] rabbitmq_management 3.6.16-rc.1 [e*] rabbitmq_management_agent 3.6.16-rc.1 [ ] rabbitmq_management_visualiser 3.6.16-rc.1 [ ] rabbitmq_mqtt 3.6.16-rc.1 [ ] rabbitmq_random_exchange 3.6.16-rc.1 [ ] rabbitmq_recent_history_exchange 3.6.16-rc.1 [ ] rabbitmq_sharding 3.6.16-rc.1 [ ] rabbitmq_shovel 3.6.16-rc.1 [ ] rabbitmq_shovel_management 3.6.16-rc.1 [ ] rabbitmq_stomp 3.6.16-rc.1 [ ] rabbitmq_top 3.6.16-rc.1 [ ] rabbitmq_tracing 3.6.16-rc.1 [ ] rabbitmq_trust_store 3.6.16-rc.1 [e*] rabbitmq_web_dispatch 3.6.16-rc.1 [ ] rabbitmq_web_mqtt 3.6.16-rc.1 [ ] rabbitmq_web_mqtt_examples 3.6.16-rc.1 [ ] rabbitmq_web_stomp 3.6.16-rc.1 [ ] rabbitmq_web_stomp_examples 3.6.16-rc.1 [ ] sockjs 0.3.4
开启插件后,通过以下命令可以查看到RabbitMQ所有监听的端口
[hayson@localhost ~]$ sudo rabbitmqctl status | grep listeners {listeners,[{clustering,25672,"::"},{amqp,5672,"::"},{http,15672,"::"}]},
以上可以看到第三个的端口
15672
,这是rabbitmq_management
插件监听的端口也可以通过端口查看
[hayson@localhost ~]$ sudo lsof -i:5672 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME beam 39771 rabbitmq 51u IPv6 143492 0t0 TCP *:amqp (LISTEN) [hayson@localhost ~]$ sudo lsof -i:15672 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME beam 39771 rabbitmq 52u IPv4 143497 0t0 TCP *:15672 (LISTEN)
-
配置防火墙端口
开启
rabbitmq-management
后,要让外部浏览器进行访问,需要防火墙端口放行[hayson@localhost ~]$ sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent [hayson@localhost ~]$ sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent [hayson@localhost ~]$ sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent [hayson@localhost ~]$ sudo firewall-cmd --reload
上面顺便把RabbitMQ目前所有监听的端口都放行了,浏览器访问WEB管理页面可以只放行
15672
。在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理台。
-
登录WEB管理台
默认用户
guest
登录(不推荐)guest默认vhost为"/",具有"/"上的全部权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users置空来取消其本地访问的限制。可以通过修改默认配置文件
rabbit.app
或自定义配置文件rabbitmq.config
进行配置外网访问-
修改默认配置文件(强烈不推荐使用)
RabbitMQ的默认配置文件位于
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin
下[hayson@localhost ~]$ sudo vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin/rabbit.app
在命令行模式下输入
/loopback
找到该行{loopback_users, [<<"guest">>]},
把中括号
[]
设为空{loopback_users, []},
保存退出,重启生效后,可以使用
guest
账号密码登录 -
自定义配置文件
[hayson@localhost ~]$ sudo vim /etc/rabbitmq/rabbitmq.config
写入如下内容
[ {rabbit, [ {loopback_users,[]}] } ].
保存后,重启
RabbitMQ
,可以在浏览器通过默认用户guest
登录。
创建用户登录(推荐)
默认情况下,访问
RabbitMQ
服务的用户名和密码都是guest
,这个账户有限制,默认只能通过本地网络(如localhost
)访问,远程网络访问受限,通过配置可以设置外网访问,但不推荐。所以需要另外创建一个用户-
创建用户
[hayson@localhost rabbitmq]$ rabbitmqctl add_user admin admin Creating user "admin"
-
为用户设置权限
设置用户
admin
访问名为“/(所有)”的虚拟主机,并对所有.*(正则)
的资源具有配置权限,并对所有资源执行写入.*(正则)
和读取.*(正则)
权限资源:[hayson@localhost rabbitmq]$ rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" Setting permissions for user "admin" in vhost "/"
-
设置用户为管理员角色
[hayson@localhost rabbitmq]$ rabbitmqctl set_user_tags admin administrator Setting tags for user "admin" to [administrator]
-
查看
RabbitMQ
用户[hayson@localhost rabbitmq]$ rabbitmqctl list_users Listing users admin [administrator] guest [administrator]
可以看到用户
admin
为管理员权限,重启RabbitMQ,可以在浏览器通过默认用户admin
登录。
-
RabbitMQ用户角色及权限控制
RabbitMQ用户角色分类:
-
none
不能访问management plugin
-
management
用户可以通过AMQP做的任何事外加:
- 列出自己可以通过AMQP登入的virtual hosts
- 查看自己的virtual hosts中的queues, exchanges 和 bindings
- 查看和关闭自己的channels 和 connections
- 查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
-
policymaker
management可以做的任何事外加:
- 查看、创建和删除自己的virtual hosts所属的policies和parameters
-
monitoring
management可以做的任何事外加:
- 列出所有virtual hosts,包括他们不能登录的virtual hosts
- 查看其他用户的connections和channels
- 查看节点级别的数据如clustering和memory使用情况
- 查看真正的关于所有virtual hosts的全局的统计信息
-
administrator
policymaker和monitoring可以做的任何事外加:
- 创建和删除virtual hosts
- 查看、创建和删除users
- 查看创建和删除permissions
- 关闭其他用户的connections
创建用户并设置角色:
-
可以创建管理员用户,负责整个MQ的运维,例如:
[hayson@localhost ~]$ sudo rabbitmqctl add_user user_admin passwd_admin
赋予其administrator角色:
[hayson@localhost ~]$ sudo rabbitmqctl set_user_tags user_admin administrator
-
可以创建RabbitMQ监控用户,负责整个MQ的监控,例如:
[hayson@localhost ~]$ sudo rabbitmqctl add_user user_monitoring passwd_monitor
赋予其monitoring角色:
[hayson@localhost ~]$ sudo rabbitmqctl set_user_tags user_monitoring monitoring
-
可以创建某个项目的专用用户,只能访问项目自己的virtual hosts
[hayson@localhost ~]$ sudo rabbitmqctl add_user user_proj passwd_proj
赋予其monitoring角色:
[hayson@localhost ~]$ sudo rabbitmqctl set_user_tags user_proj management
创建和赋角色完成后查看并确认:
[hayson@localhost ~]$ sudo rabbitmqctl list_users
RabbitMQ权限控制
默认virtual host:"/"
默认用户:guest
guest具有"/"上的全部权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users置孔来取消其本地访问的限制:
[{rabbit, [{loopback_users, []}]}]
用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。比如:
-
exchange和queue的declare与delete分别需要exchange和queue上的配置权限
-
exchange的bind与unbind需要exchange的读写权限
-
queue的bind与unbind需要queue写权限、exchange的读权限
-
发消息(publish)需exchange的写权限
-
获取或清除(get、consume、purge)消息需queue的读权限
对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
其中,<conf> <write> <read>
的位置分别用正则表达式来匹配特定的资源。
需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。
为用户赋权:
$sudo rabbitmqctl set_permissions -p /vhost1 user_admin '.*' '.*' '.*'
该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
查看权限:
$sudo rabbitmqctl list_user_permissions user_admin