【问题标题】:Configuring RabbitMQ management docker image with default setup & access UI使用默认设置和访问 UI 配置 RabbitMQ 管理 docker 映像
【发布时间】:2020-03-30 06:29:08
【问题描述】:

背景

我需要使用 RabbitMQ 服务和我的应用程序设置 docker-compose。这个 RabbitMQ 服务需要有 3 件事才能正常工作:

  • 具有完全权限的名为“user1”的用户
  • 一个名为“vhost1”的虚拟主机
  • 在“vhost1”中,我需要一个名为“Pizza”的交换器

我们尝试了什么

为了实现这一点,我们尝试在我们的项目中创建一个名为 rabbitmq 的文件夹,其中包含以下文件:

definitions.json

{
    "rabbit_version": "3.6.6",
    "users": [
     {
      "name": "user1",
      "password_hash": "pass1",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
     }
    ],
    "vhosts": [
     {
      "name": "\/vhost1"
     }
    ],
    "permissions": [
     {
      "user": "user1",
      "vhost": "\/vhost1",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
     }
    ],
    "parameters": [],
    "policies": [],
    "queues": [],
    "exchanges": [],
    "bindings": []
   }

rabbitmq.conf

loopback_users.guest = false
listeners.tcp.default = 5672

我们正在使用来自docker-composevolumes 命令安装此文件夹,并使用以下文件:

version: '3'
services:
  rabbit:
    image: rabbitmq:management
    ports:
      - "8080:15672"
      - "5672:5672"
    volumes: 
      - ${PWD}/rabbitmq:/etc/rabbitmq

问题

我们目前面临两个问题:

  1. 我们不会创建名为“Pizza”的交易所。
  2. 我们无法通过 localhost:8080 访问 RabbitMQ 管理 UI,即使我们在 docker-compose 文件中指定了此端口的映射。

问题

  1. 我们如何在defininitions.json 文件中定义虚拟主机的交换? (我在哪里可以读到它?)
  2. 为什么我们无法访问 UI?我们做错了什么?

【问题讨论】:

    标签: docker docker-compose rabbitmq


    【解决方案1】:

    解决方案

    1。交易所创建

    第一个问题很容易解决。未创建交换的原因是definitions.json 文件中的"exchanges" 字段为空。要解决此问题,您需要向该列表添加一个交换对象:

    "exchanges": [
        {
          "name": "Pizza",
          "vhost": "\/vhost1",
          "type": "fanout",
          "durable": true,
          "auto_delete": false,
          "internal": false,
          "arguments": {}
        }
      ],
    

    您可以在这篇博文中阅读更多相关信息:

    https://devops.datenkollektiv.de/creating-a-custom-rabbitmq-container-with-preconfigured-queues.html

    2。访问管理界面

    这里有几个配置问题。首先,我将容器中原始 /etc/rabbitmq 文件夹的内容与我本地文件夹中的内容一起粉碎。这不是故意的,可以在此处找到解决此问题的方法:

    Unknown variable "management.load_definitions" in rabbitmq rabbit.conf file

    第二个问题在rabbitmq.conf 文件中。我们缺少告诉应用程序加载我们的定义文件的字段。以下是rabbitmq.conf 文件的正确版本:

    loopback_users.guest = false
    listeners.tcp.default = 5672
    management.load_definitions = /etc/rabbitmq/definitions.json
    

    第三个(也是最后一个)问题是用户密码,特别是password_hash 字段,它需要遵循特定算法并以特定格式编码。更多相关内容可以阅读 RabbitMQ 的官方文档:

    https://www.rabbitmq.com/passwords.html

    要跳过处理加盐、散列和编码的痛苦,如果您只想像我们想要的那样测试用于集成目的的设置,那么只需使用示例中给出的密码test12

    "users": [
         {
          "name": "user1",
          "password_hash": "kI3GCqW5JLMJa4iX1lo7X4D6XbYqlLgxIs30+P6tENUV2POR",
          "hashing_algorithm": "rabbit_password_hashing_sha256",
          "tags": "administrator"
         }
        ]
    

    但是,如果知道如何生成 RabbitMQ 将接受的用户密码对您来说非常重要,这里是一个 bash 脚本,由同事的血泪创建:

    #!/bin/bash
    PWD_HEX=$(echo -n $1 | xxd -p)
    SALT="908D C60A" 
    HEX="$SALT $PWD_HEX"
    SHA256=$(echo -n $HEX | xxd -r -p | sha256sum)
    # This is thw pwd to be inserted on your rabbit load_definitions file
    echo "908D C60A $SHA256" | xxd -r -p | base64 
    

    用法:./my_script userpass1

    结论

    除此之外,人们应该能够创建用户、虚拟主机和交换,同时还可以通过 docker 映像访问管理 UI。

    【讨论】:

    • 如果有人有兴趣,这是PHP 7.3+版本o pass generator:php -r '$pass = "test12"; $salt = random_bytes(4); var_dump(base64_encode($salt . hash("sha256", $salt.$pass, true)));'你可以通过更改$salt="\x90\x8D\xC6\x0A"来测试它应该输出kI3GCqW5JLMJa4iX1lo7X4D6XbYqlLgxIs30+P6tENUV2POR
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多