使用默认设置配置RabbitMQ管理docker映像&;访问用户界面 背景

使用默认设置配置RabbitMQ管理docker映像&;访问用户界面 背景,docker,docker-compose,rabbitmq,Docker,Docker Compose,Rabbitmq,我需要使用RabbitMQ服务和我的应用程序设置一个docker compose。此RabbitMQ服务需要具备3项功能才能正常工作: 名为“user1”且具有完全权限的用户 名为“vhost1”的vhost 在“vhost1”里面,我需要一个叫做“Pizza”的交换 我们尝试了什么 为此,我们尝试在项目中创建一个名为rabbitmq的文件夹,其中包含以下文件: definitions.json { "rabbit_version": "3.6.6", "users": [

我需要使用RabbitMQ服务和我的应用程序设置一个
docker compose
。此RabbitMQ服务需要具备3项功能才能正常工作:

  • 名为“user1”且具有完全权限的用户
  • 名为“vhost1”的vhost
  • 在“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 compose
中的
volumes
命令,使用以下文件装载此文件夹:

version: '3'
services:
  rabbit:
    image: rabbitmq:management
    ports:
      - "8080:15672"
      - "5672:5672"
    volumes: 
      - ${PWD}/rabbitmq:/etc/rabbitmq
问题 我们目前面临两个问题:

  • 我们不是在创建名为“比萨饼”的交易所
  • 我们无法通过
    localhost:8080
    访问RabbitMQ管理UI,即使我们在
    docker compose
    文件中指定了此端口的映射
  • 问题
  • 如何在
    defininitions.json
    文件中定义vhost的交换?(我在哪里可以看到它?)
  • 为什么我们不能访问UI?我们做错了什么
  • 解决 1.交换创建 第一个问题很容易解决。未创建exchange的原因是因为
    定义.json
    文件中的
    “exchanges”
    字段为空。要解决此问题,您需要将exchange对象添加到该列表中:

    "exchanges": [
        {
          "name": "Pizza",
          "vhost": "\/vhost1",
          "type": "fanout",
          "durable": true,
          "auto_delete": false,
          "internal": false,
          "arguments": {}
        }
      ],
    
    你可以在这篇博文中了解更多信息:

    2.访问管理UI 这里有几个配置问题。首先,我将容器中原始
    /etc/rabbitmq
    文件夹的内容与本地文件夹中的内容粉碎。这不是故意的,可以在此处找到此问题的修复程序:

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

    loopback_users.guest = false
    listeners.tcp.default = 5672
    management.load_definitions = /etc/rabbitmq/definitions.json
    
    第三个(也是最后一个)问题是用户的密码,特别是
    password\u hash
    字段,它需要遵循特定的算法并以特定的格式编码。有关这方面的更多信息,请参阅RabbitMQ的官方文档:

    要跳过处理盐析、哈希和编码的痛苦,如果您只想像我们希望的那样为集成目的测试设置,那么只需使用示例中给出的密码
    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\u script userpass1

    结论
    有了所有这些,我们应该能够创建用户、虚拟主机和交换,同时还可以通过docker映像访问管理UI

    如果有人感兴趣,这是PHP7.3+版本o pass生成器:
    PHP-r'$pass=“test12”$salt=随机字节(4);var_dump(base64_编码($salt.hash($sha256',$salt.pass,true));'
    您可以通过更改
    $salt=“\x90\x8D\xC6\x0A”
    应输出
    kI3GCqW5JLMJa4iX1lo7X4D6XbYqlLgxIs30+P6tENUV2POR