安装前准备
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-serverRabbitMQ 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">>]},
上面部分显示的配置为&#xff1a;当前RabbitMQ的端口号
5672
&#xff0c;默认用户和密码都为guest
&#xff0c;身份为管理员&#xff0c;默认虚拟主机为/
&#xff0c;权限为拥有所有权限&#xff0c;登录权限只能localhost
或127.0.0.1
。如果要修改端口5672
为5673
&#xff0c;则只需把5672
改为5673
。其他修改用户名或密码把原来修改即可。自定义配置文件
通过查看服务状态
[hayson&#64;localhost ~]$ sudo systemctl status rabbitmq-server
可以看到Logs文件位置&#xff0c;打开该文件位置日志文件
[hayson&#64;localhost ~]$ cat /var/log/rabbitmq/rabbit&#64;localhost.log
这里显示的是没有找到配置文件&#xff0c;我们可以自己创建这个文件
[hayson&#64;localhost ~]$ sudo vim /etc/rabbitmq/rabbitmq.config
写入如下内容
[{rabbit, [{tcp_listeners,[5673]}]}
].保存配置后重启服务
[hayson&#64;localhost ~]$ sudo systemctl stop rabbitmq-server
[hayson&#64;localhost ~]$ sudo systemctl start rabbitmq-server
官网提供了一份rabbitmq.config示列&#xff0c;此示例文件包含设置的大多数配置项&#xff08;省略一些非常模糊的配置&#xff09;以及这些设置的文档的示例。 所有配置项都在示例中注释掉&#xff0c;因此您可以取消注释所需的内容。请注意&#xff0c;不要将其当作一般的推荐配置。
开启web界面管理插件
安装RabbitMQ后&#xff0c;默认不开启任何插件的&#xff0c;需要我们手动去开启&#xff0c;管理插件的命令为rabbitmq-plugins
&#xff0c;可以先查看该命令用法
rabbitmq-plugins用法
[hayson&#64;localhost ~]$ sudo rabbitmq-plugins
Usage:
rabbitmq-plugins [-n
Commands:list [-v] [-m] [-E] [-e] [
查看
RabbitMQ
所有可开启插件[hayson&#64;localhost ~]$ sudo rabbitmq-plugins listConfigured: E &#61; explicitly enabled; e &#61; implicitly enabled| Status: * &#61; running on rabbit&#64;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所有的插件&#xff0c;前面的中括号
[ ]
表示空为没有开启&#xff0c;其中rabbitmq_management
是web界面管理插件开启
rabbitmq_management
插件[hayson&#64;localhost ~]$ sudo rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:amqp_clientcowlibcowboyrabbitmq_web_dispatchrabbitmq_management_agentrabbitmq_managementApplying plugin configuration to rabbit&#64;localhost... started 6 plugins.可以看到共开启了
6
个插件。再次查看插件列表&#xff0c;前面中括号[ ]
出现e*
标记表示开启[hayson&#64;localhost ~]$ sudo rabbitmq-plugins listConfigured: E &#61; explicitly enabled; e &#61; implicitly enabled| Status: * &#61; running on rabbit&#64;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开启插件后&#xff0c;通过以下命令可以查看到RabbitMQ所有监听的端口
[hayson&#64;localhost ~]$ sudo rabbitmqctl status | grep listeners{listeners,[{clustering,25672,"::"},{amqp,5672,"::"},{http,15672,"::"}]},
以上可以看到第三个的端口
15672
&#xff0c;这是rabbitmq_management
插件监听的端口也可以通过端口查看
[hayson&#64;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&#64;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
后&#xff0c;要让外部浏览器进行访问&#xff0c;需要防火墙端口放行[hayson&#64;localhost ~]$ sudo firewall-cmd --zone&#61;public --add-port&#61;15672/tcp --permanent
[hayson&#64;localhost ~]$ sudo firewall-cmd --zone&#61;public --add-port&#61;5672/tcp --permanent
[hayson&#64;localhost ~]$ sudo firewall-cmd --zone&#61;public --add-port&#61;5672/tcp --permanent
[hayson&#64;localhost ~]$ sudo firewall-cmd --reload上面顺便把RabbitMQ目前所有监听的端口都放行了&#xff0c;浏览器访问WEB管理页面可以只放行
15672
。在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理台。
登录WEB管理台
默认用户
guest
登录&#xff08;不推荐&#xff09;guest默认vhost为"/"&#xff0c;具有"/"上的全部权限&#xff0c;仅能有localhost访问RabbitMQ包括Plugin&#xff0c;建议删除或更改密码。可通过将配置文件中loopback_users置空来取消其本地访问的限制。可以通过修改默认配置文件
rabbit.app
或自定义配置文件rabbitmq.config
进行配置外网访问修改默认配置文件&#xff08;强烈不推荐使用&#xff09;
RabbitMQ的默认配置文件位于
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin
下[hayson&#64;localhost ~]$ sudo vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.16-rc.1/ebin/rabbit.app
在命令行模式下输入
/loopback
找到该行{loopback_users, [<<"guest">>]},
把中括号
[]
设为空{loopback_users, []},
保存退出&#xff0c;重启生效后&#xff0c;可以使用
guest
账号密码登录自定义配置文件
[hayson&#64;localhost ~]$ sudo vim /etc/rabbitmq/rabbitmq.config
写入如下内容
[{rabbit, [{loopback_users,[]}]}
].保存后&#xff0c;重启
RabbitMQ
&#xff0c;可以在浏览器通过默认用户guest
登录。
创建用户登录(推荐)
默认情况下&#xff0c;访问
RabbitMQ
服务的用户名和密码都是guest
,这个账户有限制&#xff0c;默认只能通过本地网络&#xff08;如localhost
&#xff09;访问&#xff0c;远程网络访问受限&#xff0c;通过配置可以设置外网访问&#xff0c;但不推荐。所以需要另外创建一个用户创建用户
[hayson&#64;localhost rabbitmq]$ rabbitmqctl add_user admin admin
Creating user "admin"为用户设置权限
设置用户
admin
访问名为“/(所有)”的虚拟主机&#xff0c;并对所有.*(正则)
的资源具有配置权限&#xff0c;并对所有资源执行写入.*(正则)
和读取.*(正则)
权限资源&#xff1a;[hayson&#64;localhost rabbitmq]$ rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/"设置用户为管理员角色
[hayson&#64;localhost rabbitmq]$ rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator]查看
RabbitMQ
用户[hayson&#64;localhost rabbitmq]$ rabbitmqctl list_users
Listing users
admin [administrator]
guest [administrator]可以看到用户
admin
为管理员权限&#xff0c;重启RabbitMQ&#xff0c;可以在浏览器通过默认用户admin
登录。
RabbitMQ用户角色及权限控制
RabbitMQ用户角色分类&#xff1a;
none
不能访问management plugin
management
用户可以通过AMQP做的任何事外加&#xff1a;
- 列出自己可以通过AMQP登入的virtual hosts
- 查看自己的virtual hosts中的queues, exchanges 和 bindings
- 查看和关闭自己的channels 和 connections
- 查看有关自己的virtual hosts的“全局”的统计信息&#xff0c;包含其他用户在这些virtual hosts中的活动。
policymaker
management可以做的任何事外加&#xff1a;
- 查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事外加&#xff1a;
- 列出所有virtual hosts&#xff0c;包括他们不能登录的virtual hosts
- 查看其他用户的connections和channels
- 查看节点级别的数据如clustering和memory使用情况
- 查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事外加:
- 创建和删除virtual hosts
- 查看、创建和删除users
- 查看创建和删除permissions
- 关闭其他用户的connections
创建用户并设置角色&#xff1a;
可以创建管理员用户&#xff0c;负责整个MQ的运维&#xff0c;例如&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl add_user user_admin passwd_admin
赋予其administrator角色&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl set_user_tags user_admin administrator
可以创建RabbitMQ监控用户&#xff0c;负责整个MQ的监控&#xff0c;例如&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl add_user user_monitoring passwd_monitor
赋予其monitoring角色&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl set_user_tags user_monitoring monitoring
可以创建某个项目的专用用户&#xff0c;只能访问项目自己的virtual hosts
[hayson&#64;localhost ~]$ sudo rabbitmqctl add_user user_proj passwd_proj
赋予其monitoring角色&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl set_user_tags user_proj management
创建和赋角色完成后查看并确认&#xff1a;
[hayson&#64;localhost ~]$ sudo rabbitmqctl list_users
RabbitMQ权限控制
默认virtual host&#xff1a;"/"
默认用户&#xff1a;guest
guest具有"/"上的全部权限&#xff0c;仅能有localhost访问RabbitMQ包括Plugin&#xff0c;建议删除或更改密码。可通过将配置文件中loopback_users置孔来取消其本地访问的限制&#xff1a;
[{rabbit, [{loopback_users, []}]}]
用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等&#xff0c;操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为&#xff0c;写权限可向资源发送消息&#xff0c;读权限从资源获取消息。比如&#xff1a;
exchange和queue的declare与delete分别需要exchange和queue上的配置权限
exchange的bind与unbind需要exchange的读写权限
queue的bind与unbind需要queue写权限、exchange的读权限
发消息(publish)需exchange的写权限
获取或清除(get、consume、purge)消息需queue的读权限
对何种资源具有配置、写、读的权限通过正则表达式来匹配&#xff0c;具体命令如下&#xff1a;
set_permissions [-p
其中&#xff0c;
的位置分别用正则表达式来匹配特定的资源。
需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。
为用户赋权&#xff1a;
$sudo rabbitmqctl set_permissions -p /vhost1 user_admin &#39;.*&#39; &#39;.*&#39; &#39;.*&#39;
该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
查看权限&#xff1a;
$sudo rabbitmqctl list_user_permissions user_admin