发布于 1年前

使用docker-compose搭建配置RabbitMQ

文中RabbitMQ的版本是:RabbitMQ 3.9。

配置RabbitMQ Servcer

1. 创建rabbitmq目录

mkdir rabbitmq

在目录rabbitmq创建rabbitmq server配置文件rabbitmq.conf 和 definitions.json。

2. 编辑rabbitmq.conf

vim rabbitmq.conf

rabbitmq.conf这里主要设置两个参数:loopback_users.guest和management.load_definitions。更多参数参考rabbitmq.conf示例

loopback_users.guest = false
management.load_definitions = /etc/rabbitmq/definitions.json

loopback_users.guest

用户guest/guest是rabbitmq的默认用户,此时也是管理员用户。默认情况下,guest用户限制为只能通过本机访问,即使用localhost:15672访问。如果通过远程访问,则会报错User can only log in via localhost。

允许guest通过远程访问,可以在修改配置loopback_users.guest,设置为false。生产环境中不建议允许guest远程访问。guest默认是管理员。

management.load_definitions

配置definitions.json文件的路径,RabbitMQ server启动时会加载schema definitionsJSON文件,配置server。

3. 配置definitions.json

definitions.json配置了用户,管理员,vhost以及权限。

{
 "rabbit_version": "3.9",
 "users": [
  {
   "name": "local_jobs",
   "password_hash": ">>>HASH<<<",
   "hashing_algorithm": "rabbit_password_hashing_sha256",
   "tags": ""
  },
  {
   "name": "adminuser",
   "password_hash": ">>>HASH<<<",
   "hashing_algorithm": "rabbit_password_hashing_sha256",
   "tags": "administrator"
  }
 ],
 "vhosts": [
  {
   "name": "\/"
  },
 ],
 "permissions": [
  {
   "user": "local_jobs",
   "vhost": "\/",
   "configure": ".*",
   "write": ".*",
   "read": ".*"
  }
 ],
 "parameters": [],
 "policies": [],
 "queues": [],
 "exchanges": [],
 "bindings": []
}

用户配置

users节点,配置用户列表,配置项为:

  • name:用户名
  • password_hash:哈希密码,它的值是用hashing_algorithm配置的算法加密后的字符串。实际配置需要替换示例的>>>HASH<<<
  • hashing_algorithm:指定密码加密的哈希算法,这里使用了rabbit_password_hashing_sha256。
  • tags:用户标签,其中administrator标签是管理员标签

以下提供bash版,生成sha256的脚步:

#!/bin/bash

function encode_password()
{
    SALT=$(od -A n -t x -N 4 /dev/urandom)
    PASS=$SALT$(echo -n $1 | xxd -ps | tr -d '\n' | tr -d ' ')
    PASS=$(echo -n $PASS | xxd -r -p | sha256sum | head -c 128)
    PASS=$(echo -n $SALT$PASS | xxd -r -p | base64 | tr -d '\n')
    echo $PASS
}

调用:

encode_password "some-password"

vhosts节点和permissions节点配置虚拟节点和权限。此处不展开说明。

Docker Compose配置

接着就是把以上配置加入到docker-compose.yml中。

在rabbitmq目录下,创建docker-compse.yml文件,添加以下内容:

version: "3.2"
services:
  rabbitmq:
    image: rabbitmq:3.9-management-alpine
    container_name: 'rabbitmq'
    ports:
        - 5672:5672
        - 15672:15672
    volumes:
        - ./data/:/var/lib/rabbitmq/
        - ./log/:/var/log/rabbitmq
        - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
        - ./definitions.json:/etc/rabbitmq/definitions.json:ro
    networks:
        - rabbitmq_network

networks:
  rabbitmq_network:
    driver: bridge

rabbitmq官方提供了几个版本的mq-server镜像,你可以根据自己需要修改:

  • rabbitmq:3.9:不包含management插件
  • rabbitmq:3.9-management:包含management插件,默认启动
  • rabbitmq:3.9-management-alpine:基于轻量Linux版alpine搭建的镜像。

启动rabbitmq

docker-compose up -d

验证rabbitmq

在浏览器打开rabbitmq管理界面:http://localhost:15672/,使用管理员adminuser和设置的密码登录。或者账号guest和密码guest登录

关闭rabbitmq

docker-compose down

问题

一、Linux因权限报错:Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only

详细报错:

2022-05-04 13:12:34.580787+00:00 [erro] <0.130.0> error:{badmatch,{error,{{shutdown,{failed_to_start_child,auth,{"Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only",[{auth,init_no_setcookie,0,[{file,"auth.erl"},{line,293}]},{auth,init,1,[{file,"auth.erl"},{line,144}]},{gen_server,init_it,2,[{file,"gen_server.erl"},{line,423}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,390}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,226}]}]}}},{child,undefined,net_sup_dynamic,{erl_distribution,start_link,[[rabbit_prelaunch_15@localhost,shortnames],false,net_sup_dynamic]},permanent,false,1000,supervisor,[erl_distribution]}}}}

解决:此处需要把宿主机上的data目录权限设置为 700,即只允许用户可读写执行。

二、Windows报错:Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only

解决:把docker-compose里的数据目录:

/var/lib/rabbitmq/

改为:

/var/lib/rabbitmq/mnesia

©2020 edoou.com   京ICP备16001874号-3