保姆级教程:手把手带你安装 RabbitMQ

06-02 1238阅读

保姆级教程:手把手带你安装 RabbitMQ

  • 保姆级教程:手把手带你安装 RabbitMQ
    • 一、下载软件包
    • 二、上传软件包到服务器
    • 三、安装
      • 3.1 创建用户组和用户
      • 3.2 安装Erlang运行环境
      • 3.3 解压 rabbitmq-server 软件包
      • 3.4 添加环境变量
      • 3.5 将`rabbitmq_server`做成系统服务
      • 3.6 设置开机启动
      • 3.7 启动 rabbitmq-server
      • 四、配置用户、权限、核心参数
        • 4.1 通过静态配置文件
        • 4.2 通过 rabbitmqctl 命令配置
        • 五、了解 web 管理页面
          • 5.1 登录 web 管理页面
          • 5.2 核对节点的参数
          • 六、问题排查
            • 6.1 rabbitmq 启动失败怎么办
            • 6.2 无法打开 web 管理页面
            • 6.3 rabbitmqctl 命令执行时报错

              保姆级教程:手把手带你安装 RabbitMQ

              一、下载软件包

              本文使用的 rabbitmq_server是 3.6.1 版本,

              配套的erlang是17.4,软件包我已经放在了Gitee仓库里面。

              我的操作系统是 CentOS 7。

              RabbitMQ版本Erlang最低版本操作系统
              3.6.117.4CentOS 7

              如果你想使用较新版本,可以从 GitHub 下载:

              上周最新发布的版本已经是4.1.0版本了,点击这里跳转到rabbitmq-server在 GitHub 上的 Release 页面。

              RabbitMQ 是基于 Erlang 语言开发的,所以它的运行需要有 Erlang 运行环境。erlang-rpm是由 RabbitMQ 团队维护的,用于制作精简版的 erlang 软件包,仅提供运行 RabbitMQ 所需的组件。如果你只是 RabbitMQ 中使用,那必须推荐使用这种方式安装。

              erlang-rpm 在 GitHub 上的 Release 页面,点击这里可以跳转过去。

              二、上传软件包到服务器

              上传这两个软件包到你的Linux环境下,本文以上传到/app目录为例:

              • erlang软件包:erlang-17.4-1.el6.x86_64.rpm
              • rabbitmq_server软件包:rabbitmq_server-3.6.1.zip

                如果没有/app目录就创建一下吧,或者使用其他的目录也行,看你喜欢放在什么位置。

                mkdir -p /app
                

                三、安装

                3.1 创建用户组和用户

                这里需要注意哦,我登录服务器、上传软件包,使用的都是dapp用户。

                我也是直接使用dapp用户进行安装。

                dapp用户是我自己日常开发使用的用户,很早之前就已经创建了的。

                所以,如果你也是直接使用当前用户安装,则不需要执行下述的命令了。

                如果你想使用rabbitmq用户进行安装(建议这样),则需要先新增用户组和用户,

                你需要有执行命令的权限,如果当前是 root 用户,则执行:

                [root@MyLinux ~]# groupadd rabbitmq
                [root@MyLinux ~]# useradd -r -g rabbitmq rabbitmq
                

                如果当前是非 root 用户,则执行下述命令,

                这要求 groupadd 和 useradd 命令在 dapp 用户的sudo 命令列表之中,否则也没有权限:

                [dapp@MyLinux ~]# sudo groupadd rabbitmq
                [dapp@MyLinux ~]# sudo useradd -r -g rabbitmq rabbitmq
                

                3.2 安装Erlang运行环境

                cd /app && sudo rpm -ivh erlang-17.4-1.el6.x86_64.rpm
                

                3.3 解压 rabbitmq-server 软件包

                cd /app
                # 解压,得到 rabbitmq_server-3.6.1 文件夹
                unzip rabbitmq_server-3.6.1.zip
                # 做个软链接
                ln -s rabbitmq_server-3.6.1 rabbitmq
                

                如果你还没有 unzip 命令,可以执行如下命令安装:

                sudo yum install -y unzip
                

                3.4 添加环境变量

                rabbitmq_server的可执行文件、管理工具都位于/app/rabbitmq_server-3.6.1/sbin目录之下,

                我们把这个路径添加到到PATH变量之中,方便我们执行 rabbitmq 的维护命令。

                vim ~/.bash_profile
                # 将 /app/rabbitmq/sbin 追加到 PATH 变量后面,然后 :wq 保存关闭文件
                PATH=$PATH:$HOME/.local/bin:$HOME/bin:/app/rabbitmq/sbin
                # 执行脚本使环境变量实时生效
                . ~/.bash_profile
                

                你也可以添加到 /etc/profile 文件中,这样就是对所有用户都生效了。

                3.5 将rabbitmq_server做成系统服务

                # 切换到临时目录
                cd /tmp
                # 再使用 vim 创建这个文件
                vim rabbitmq-server.service
                

                将下面的内容,拷贝到这个rabbitmq-server.service文件之中,然后 :wq 保存关闭文件。

                注意了,如果你前面使用的不是/app目录,那要注意修改下面涉及到的路径哦。这份配置里面也包含了日志的路径。

                [Unit]
                Description=RabbitMQ broker
                After=network.target epmd@0.0.0.0.socket
                Wants=network.target epmd@0.0.0.0.socket
                [Service]
                Type=simple
                # 使用你的实际用户,我使用的是 dapp 用户
                User=dapp
                # 使用你的实际用户组
                Group=dapp
                # 缩短启动超时时间(避免卡死)
                TimeoutStartSec=60
                # 停止超时时间
                TimeoutStopSec=30
                # 崩溃后自动重启
                Restart=on-failure
                # 重启间隔
                RestartSec=10
                # 指定工作目录
                WorkingDirectory=/app/rabbitmq
                # 重要!将 HOME 指向安装目录
                Environment=HOME=/app/rabbitmq
                # 数据目录指向 /app/rabbitmq/data
                Environment=RABBITMQ_MNESIA_BASE=/app/rabbitmq/data
                # 日志目录显式声明
                Environment=RABBITMQ_LOG_BASE=/app/rabbitmq/log
                # 文件描述符限制
                LimitNOFILE=65536
                # 启动 rabbitmq-server
                ExecStart=/app/rabbitmq/sbin/rabbitmq-server
                # 使用 rabbitmqctl 停止服务
                ExecStop=/app/rabbitmq/sbin/rabbitmqctl stop
                [Install]
                WantedBy=multi-user.target
                

                再执行下述命令,将这个文件,拷贝到系统服务目录之下,并使之生效。

                # 拷贝过去
                sudo cp /tmp/rabbitmq-server.service /etc/systemd/system/rabbitmq-server.service
                # 重新加载 Systemd 配置
                sudo systemctl daemon-reload
                

                然后我们就可以愉快的使用下述命令来操作 rabbitmq 的启动、停止、检查状态了。

                下述的 6 条命令,你不要马上就执行了哈,这里只是告诉你,可以这么玩。

                # 启用 RabbitMQ 服务开机启动
                sudo systemctl enable rabbitmq-server
                # 禁用 RabbitMQ 服务开机启动
                sudo systemctl disable rabbitmq-server
                # 启动 RabbitMQ 服务
                sudo systemctl start rabbitmq-server
                # 检查 RabbitMQ 服务状态
                sudo systemctl status rabbitmq-server
                # 停止 RabbitMQ 服务:
                sudo systemctl stop rabbitmq-server
                # 重启 RabbitMQ 服务:
                sudo systemctl restart rabbitmq-server
                

                3.6 设置开机启动

                RabbitMq作为Server,一般情况下,都是需要设置开启启动的。

                我们生产环境,前端时间就有一台高配物理机,因硬件故障,凌晨自动重启了。

                经排查,是因为一根内存条和一个CPU2故障,导致服务器重启了。

                下图是使用 who -b 查到的系统重启时间

                保姆级教程:手把手带你安装 RabbitMQ

                保姆级教程:手把手带你安装 RabbitMQ

                所以,设置开启启动,是很有必要的。

                RabbitMQ 节点上线,还可以正常提供服务。

                通过执行下述命令,设置开机启动:

                # 启用 开机启动
                sudo systemctl enable rabbitmq-server
                

                执行之后,会有如下提示,代表设置 OK 了。

                Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /etc/systemd/system/rabbitmq-server.service.
                

                3.7 启动 rabbitmq-server

                紧接着我们要开始进行一些配置了,必须要先启动rabbitmq-server才能进行设置。

                执行如下命令,启动服务,顺手再检查一下服务状态。

                # 启动 RabbitMQ 服务
                sudo systemctl start rabbitmq-server
                # 检查 RabbitMQ 服务状态
                sudo systemctl status rabbitmq-server
                

                四、配置用户、权限、核心参数

                有两种方式,来配置用户、权限、虚拟主机、服务核心参数阈值等。

                我使用的是第一种方式,静态配置文件。

                4.1 通过静态配置文件

                编辑配置文件,防止重启配置丢失。

                使用 vim 命令编辑这个配置文件

                vim /app/rabbitmq/etc/rabbitmq/rabbitmq.config
                

                将下面的文本,拷贝进去,注意修改其中的用户名和密码,然后:wq保存退出。

                [
                  {rabbit, [
                    {default_vhost, },
                    {default_user, },
                    {default_pass, },
                    {default_permissions, [, , ]},
                    {default_user_tags, [administrator]},
                    {hipe_compile, true},
                    {log_levels, [{connection, info}, {channel, info}]},
                    {vm_memory_high_watermark_paging_ratio, 0.6},
                    {vm_memory_high_watermark, 0.4}
                  ]}
                ].
                

                配置完成之后,使用下面的命令重启一下 rabbitmq-server,保证配置生效。

                # 重启 RabbitMQ 服务:
                sudo systemctl restart rabbitmq-server
                

                4.2 通过 rabbitmqctl 命令配置

                你也可以执行下述命令进行配置,但不会持久化到静态配置文件​中,

                而是存储在 RabbitMQ 的​内部数据库(Mnesia)​​ 中,​服务重启后依然有效​​。

                但若删除了 Mnesia 数据,则配置丢失。

                # 查看所有的用户
                rabbitmqctl list_users
                # 查看 guest 用户的权限
                rabbitmqctl list_user_permissions guest
                # 删除 guest 用户
                rabbitmqctl delete_user guest
                # 新增一个用户,并设置密码
                rabbitmqctl add_user mqadmin 2025V8#Hello
                # 设置为管理员
                rabbitmqctl set_user_tags mqadmin administrator
                # 设置 mqadmin 的权限
                # 这里意指在虚拟主机 /(RabbitMQ 的默认虚拟主机)上配置 「完整的权限控制」
                rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*"
                # 查看 mqadmin 用户的权限
                rabbitmqctl list_user_permissions mqadmin
                

                五、了解 web 管理页面

                RabbitMQ 的 Web 管理界面​ 是由官方插件 ​​rabbitmq_management​​ 提供的。

                这个插件基于 HTTP API 构建,提供了一个可视化 WEB 界面,用于监控和管理 RabbitMQ 服务器、交换机、队列、用户权限等。

                通过浏览器访问管理界面时,默认端口 15672,这个端口是可以修改的。

                5.1 登录 web 管理页面

                然后就可以登录 web 管理页面,详细看下各种指标、参数是否正常。

                如果你的服务器IP地址是 192.168.3.27,那就在浏览器输入:

                http://192.168.3.27:15672

                使用上述 rabbitmq.config 配置文件中的用户名和密码,登录;

                保姆级教程:手把手带你安装 RabbitMQ

                5.2 核对节点的参数

                展开 Node 这一段,检查下述的参数。

                保姆级教程:手把手带你安装 RabbitMQ

                这里我们可以看到,RabbitMQ 把文件描述符分成了:

                File descriptors 和 Socket descriptors。

                我们知道,在 Linux 操作系统下,有一种经典的设计哲学:​​“一切皆文件”(Everything is a file)​​,那为什么在这里,RabbitMQ 区分开了呢?

                主要是因为,File descriptors(文件描述符)和 Socket descriptors(套接字描述符),

                本质上是两种不同的系统资源限制指标,用在不同的 I/O 场景之下。

                ​(1)​File descriptors(文件描述符) ​:

                用于操作 ​​本地文件​​(如日志、持久化消息存储),比如消息持久化到磁盘、日志写入等场景;

                (2)​Socket descriptors(套接字描述符) :​

                用于 ​网络通信​(如客户端连接、集群节点间通信),比如:客户端连接、集群节点同步、插件通信(如 MQTT/STOMP)。

                分开统计的好处是,可以精准的定位系统瓶颈所在。

                如果是文件描述符耗尽, 那可能是磁盘 I/O 过载或者日志写入频繁。

                在队列开启了持久化场景下,持久化的消息是按分片存储的,每个分片是一个独立的文件。

                当消息量激增时,新的分片文件被频繁创建,旧的分片可能仍然处理打开状态(等待合并或者删除)。

                如果是套接字描述符耗尽, 那就可能是客户端连接过多。

                对于 Memory(内存)和 Disk Space(磁盘空间)这两个指标,

                也要检查其高水位(high watermark),也就是上限阈值,设置的是否合理。

                如果 RabbitMQ 节点的内存和磁盘使用量,超过了这个高水位,

                节点会触发保护机制,防止节点因资源耗尽而崩溃。

                这也很好理解,操作系统好比官家,官家治世,讲究个度。

                若你(进程)贪得无厌,官家自会「按律处置」,

                夺你符印(回收内存),或逐出朝堂(kill -9)。

                扯远了。。。。。。。

                当内存或磁盘使用量超过阈值时,RabbitMQ 会有如下 3 个表现:

                • ​​阻塞生产者​​(停止接收新消息)。
                • ​​丢弃非持久化消息​​(内存不足时)。
                • ​​强制关闭连接​​(极端情况下)。

                  比较明显的现象就是,你会发现操作 MQ 接口的线程,卡死了,就是被阻塞了。

                  六、问题排查

                  6.1 rabbitmq 启动失败怎么办

                  (1)执行下述命令,先收集情况

                  # 检查端口占用
                  sudo netstat -antp | grep LISTEN | egrep ":5672|:15672"
                  # 检查进程残留
                  # beam.smp:  Erlang 虚拟机进程
                  # epmd: Erlang 端口映射守护进程
                  ps -ef | egrep "beam|epmd"
                  

                  如果发现有进程残留,则杀死所有残留的 RabbitMQ/Erlang 进程

                  pkill -9 beam.smp
                  pkill -9 epmd
                  

                  (2)删除日志和数据

                  # 删除日志
                  /bin/rm -fv /app/rabbitmq/log/*.log
                  # 删除旧的 Mnesia 数据库和节点信息(​​谨慎操作,会丢失所有数据​)
                  /bin/rm -rfv /app/rabbitmq/data/mnesia/
                  

                  一般来讲,启动失败,是因为有一些持久化数据,遭到了破坏。

                  可能是服务还在运行时,强制 kill 导致的。

                  比较有用的,就是删除旧的 Mnesia 数据库和节点信息,从头再来​了。

                  6.2 无法打开 web 管理页面

                  这个大概率就是防火墙的原因。

                  执行下述命令,开放防火墙端口(15672、5672)。

                  sudo firewall-cmd --add-port={5672,15672}/tcp --permanent
                  sudo firewall-cmd --reload
                  

                  6.3 rabbitmqctl 命令执行时报错

                  按照本教程安装完成之后,如果你使用 rabbitmqctl list_users, 会得到如下错误。

                  保姆级教程:手把手带你安装 RabbitMQ

                  [dapp@cs01-phy ~]$ rabbitmqctl list_users
                  Error: unable to connect to node 'dxmq@cs01-phy': nodedown
                  DIAGNOSTICS
                  ===========
                  attempted to contact: ['dxmq@cs01-phy']
                  dxmq@csmssvr01-phy:
                    * connected to epmd (port 4369) on csmssvr01-phy
                    * epmd reports node 'dxmq' running on port 25672
                    * TCP connection succeeded but Erlang distribution failed
                    * suggestion: hostname mismatch?
                    * suggestion: is the cookie set correctly?
                    * suggestion: is the Erlang distribution using TLS?
                  current node details:
                  - node name: 'rabbitmq-cli-41@cs01-phy'
                  - home dir: /home/dapp
                  - cookie hash: CexviT8XR/RDQNx/xnb1fw==
                  [dapp@cs01-phy ~]$ 
                  

                  仔细看一下报错的信息,错误的原因是「nodedown」,

                  可能的原因,也有提示:

                  • hostname mismatch 主机名不匹配
                  • cookie不正确
                  • Erlang分布式使用了TLS

                    我先抛出答案,

                    原因是:cookie不正确,需要保证cookie一致。

                    也就是说,需要将rabbitmq-server的安装目录下的.erlang.cookie文件,拷贝到你执行rabbitmqctl命令的用户的home目录下面,这个问题就解决了。

                    那么.erlang.cookie是什么?要保证谁和谁的cookie一致?

                    当你执行 rabbitmqctl list_users命令时,底层的步骤是:

                    (1)rabbitmqctl 命令作为客户端,会尝试连接到本地 RabbitMQ 节点,也就是本机安装的尝RabbitMQ-Server服务端,(默认节点名:rabbit@,我们这里不会使用这个默认的节点名)。

                    在配置文件 /app/rabbitmq/etc/rabbitmq/rabbitmq-env.conf 中,

                    我们指定了节点名是 dxmq,

                    本机的 hostname 是 cs01-phy ,

                    所以完整的节点名称是 dxmq@cs01-phy。

                    主机名当然是可以解析的,可以使用 ping 命令试一下。

                    保姆级教程:手把手带你安装 RabbitMQ

                    如果你使用 rabbitmqctl 命令,访问另外一台服务器上 rabbitmq-server 有哪些用户,

                    你需要增加 -n node 参数,这个时候你可能手误输错主机名,

                    如果主机名无法解析,就会报错 hostname mismatch,

                    这就是这个错误的来源;

                    (2)rabbitmqctl 根据上一步确定了服务端的地址之后,现在要开始建立​ Erlang 分布式通信了,Erlang 分布式通信端口是25672。

                    这里插一嘴,我们看下 rabbitmq-server 会监听哪些端口?

                    sudo netstat -antp | egrep 'Proto|LISTEN.*beam|LISTEN.*epmd'
                    

                    保姆级教程:手把手带你安装 RabbitMQ

                    • 4369端口:(核心端口) 这个是 EPMD 进程监听的端口,EPMD 是 Erlang Port Mapper Daemon,也就是 Erlang 分布式系统的端口映射服务,负责管理 Erlang 节点之间的通信端口。RabbitMQ 集群节点会通过 EPMD 查找其他节点的实际通信端口(如 25672)。

                    • 5672端口:(核心端口) 这是AMQP 默认端口,RabbitMQ 的核心消息协议(AMQP 0-9-1)默认端口,客户端(生产者/消费者)通过此端口连接。

                    • 15672端口:(核心端口) HTTP API 和管理界面端口,RabbitMQ 的 Web 管理插件(rabbitmq-management)端口,提供可视化管理和 REST API。

                    • 25672端口:(核心端口) Erlang 分布式通信端口。RabbitMQ 节点间通信(如集群组建、镜像队列同步)的 Erlang 分布式协议端口。客户端工具(如 rabbitmqctl)也通过此端口与节点交互。

                    • 1883端口:(扩展协议端口) MQTT 协议端口。支持 MQTT 协议(需启用插件 rabbitmq_mqtt),常用于 IoT 设备或轻量级消息客户端。这是个扩展协议,不同的协议有不同的端口。

                      还有一些其他可能用到的端口​,比如与 TLS 相关的,这里就不再​啰嗦了。

                      第一步, rabbitmqctl 连接 EPMD​​ (Erlang Port Mapper Daemon,Erlang的端口映射守护进程服务,默认端口 4369)查询目标节点的 25672 端口,如果 EPMD 未运行或端口不通,会报错 epmd timeout。

                      第二步, rabbitmqctl 与 rabbitmq-server 的 25672 端口建立 TCP 连接。从上面的报错信息可以看到,与 25672 端口的TCP连接是成功的。

                      保姆级教程:手把手带你安装 RabbitMQ

                      第三步, but Erlang distribution failed的原因:Cookie 不匹配导致的。

                      Erlang 节点间通信必须使用相同的 Cookie,否则拒绝连接,这类似于鉴权时的密钥。

                      服务端​ rabbitmq-server 的 Cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 路径之下(默认情况下)。

                      ​​是当 RabbitMQ ​​首次启动​​时,如果不存在,则随机生成一个字符串存于其中。

                      而我们这里由于是自定义安装,.erlang.cookie 的位置在安装目录之下,

                      也就是 /app/rabbitmq/.erlang.cookie,

                      注意,是个隐藏文件哦,需要使用 ls -al 才能看到。

                      ls -al /app/rabbitmq/.erlang.cookie
                      

                      客户端工具 rabbitmqctl,在你执行 rabbitmqctl list_users 命令时,

                      会尝试读取当前用户的home目录下的文件,也就是 ~/.erlang.cookie,

                      如果你是第一次执行这个命令,那么 .erlang.cookie是不存在的,会生成一个。

                      你可以执行下面命令看下是否存在;

                      ls -al ~/.erlang.cookie
                      

                      我们使用下述命令,看下内容是否一致

                      cat /app/rabbitmq/.erlang.cookie
                      FALWWORJVOTKASSZEBJR
                      cat ~/.erlang.cookie
                      OGOITBTIAMVLYPGHOSVE
                      

                      你会发现,二者是不一致的,

                      这就是 rabbitmqctl list_users 命令执行失败的原因了。

                      解决方法也很简单,

                      删掉~/.erlang.cookie,

                      把/app/rabbitmq/.erlang.cookie拷贝过去。

                      /bin/rm -fv ~/.erlang.cookie
                      cp -v /app/rabbitmq/.erlang.cookie ~
                      

                      然后再执行命令,就不会报错了。

                      [dapp@cs01-phy ~]$ rabbitmqctl list_users
                      Listing users ...
                      rmqadmin        [administrator]
                      [dapp@cs01-phy ~]$ 
                      

                      虽然是长篇大论,但仍然是把这个问题搞清楚了,而且过程中有了更深入的了解。

                      所以出现问题的时候就是学习的最佳时机。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码