三、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包可以从BintrayGitHub获得,选择你需要相应的版本下载。

下载完成,安装

[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提供了三种自定义服务器的通用方法:

  1. 配置文件(推荐使用的方式)
  2. 环境变量
  3. 运行时参数和策略

配置文件

以修改RabbitMQ默认端口5672为例。修改端口56725673

  • 默认配置文件(强烈不推荐修改默认配置文件)

    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,身份为管理员,默认虚拟主机为/,权限为拥有所有权限,登录权限只能localhost127.0.0.1。如果要修改端口56725673,则只需把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)访问,远程网络访问受限,通过配置可以设置外网访问,但不推荐。所以需要另外创建一个用户

    1. 创建用户

      [hayson@localhost rabbitmq]$ rabbitmqctl add_user admin admin
      Creating user "admin"
      
    2. 为用户设置权限

      设置用户admin访问名为“/(所有)”的虚拟主机,并对所有.*(正则)的资源具有配置权限,并对所有资源执行写入.*(正则)和读取.*(正则)权限资源:

      [hayson@localhost rabbitmq]$ rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
      Setting permissions for user "admin" in vhost "/"
      
    3. 设置用户为管理员角色

      [hayson@localhost rabbitmq]$ rabbitmqctl set_user_tags admin administrator
      Setting tags for user "admin" to [administrator]
      
    4. 查看RabbitMQ用户

      [hayson@localhost rabbitmq]$ rabbitmqctl list_users
      Listing users
      admin   [administrator]
      guest   [administrator]
      

      可以看到用户admin为管理员权限,重启RabbitMQ,可以在浏览器通过默认用户admin登录。

RabbitMQ用户角色及权限控制

RabbitMQ用户角色分类:

  • none

    不能访问management plugin

  • management

    用户可以通过AMQP做的任何事外加:

    1. 列出自己可以通过AMQP登入的virtual hosts
    2. 查看自己的virtual hosts中的queues, exchanges 和 bindings
    3. 查看和关闭自己的channels 和 connections
    4. 查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
  • policymaker

    management可以做的任何事外加:

    1. 查看、创建和删除自己的virtual hosts所属的policies和parameters
  • monitoring

    management可以做的任何事外加:

    1. 列出所有virtual hosts,包括他们不能登录的virtual hosts
    2. 查看其他用户的connections和channels
    3. 查看节点级别的数据如clustering和memory使用情况
    4. 查看真正的关于所有virtual hosts的全局的统计信息
  • administrator

    policymaker和monitoring可以做的任何事外加:

    1. 创建和删除virtual hosts
    2. 查看、创建和删除users
    3. 查看创建和删除permissions
    4. 关闭其他用户的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 
posted @ 2018-11-15 10:28  Hayson  阅读(456)  评论(0编辑  收藏  举报