无法在docker容器上访问RabbitMQ UI

3

我目前正在一个项目上工作,其中我在Microsoft Azure上有一个虚拟机,并尝试使用Traefik反向代理的帮助下通过不同的路由访问多个Docker容器。除了反向代理之外,我需要的第一个服务是RabbitMQ,并且我应该能够在/rmq路由上访问其用户界面。现在,我有以下的docker-compose文件来构建这两个服务:

version: "3.5"
services:
  rabbitmq:
    image: rabbitmq:3-alpine
    expose:
      - 5672
      - 15672
    volumes:
      - ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
    labels:
      - traefik.enable=true
      - traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
      # needed, when you do not have a route "/rmq" inside your container (according to https://dev59.com/Q7fna4cB1Zd3GeqPx73-)
      - traefik.http.routers.rabbitmq.middlewares=strip-docs
      - traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
      - traefik.port=15672
    networks:
      - proxynet

  traefik:
    image: traefik:2.1
    command: --api=true     # Enables the web UI
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
    ports:
      - 80:80
      - 443:443
    labels:
      traefik.enable: true
      traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
      traefik.http.routers.traefik.service: "api@internal"
    networks:
      - proxynet

以下是我的traefik.toml文件的内容:

logLevel = "DEBUG"
debug = true

[api]
  dashboard = true
  insecure = false
  debug = true

[providers.docker]
  endpoint = "unix:///var/run/docker.sock"
  watch = true

[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.web-secure]
    address = ":443"

[log]
  level = "DEBUG"
  format = "json"

< p > enabled_plugins 文件指定应激活哪些RabbitMQ插件。在这里,我有rabbitmq_management插件(以及其他插件),我认为需要访问RabbitMQ UI。我甚至检查了RabbitMQ容器的日志,显然rabbitmq_management已经正确启动:

rabbitmq_1         | 2021-01-30 15:50:30.538 [info] <0.730.0> Server startup complete; 7 plugins started.
rabbitmq_1         |  * rabbitmq_stomp
rabbitmq_1         |  * rabbitmq_federation_management
rabbitmq_1         |  * rabbitmq_mqtt
rabbitmq_1         |  * rabbitmq_federation
rabbitmq_1         |  * rabbitmq_management
rabbitmq_1         |  * rabbitmq_web_dispatch
rabbitmq_1         |  * rabbitmq_management_agent
rabbitmq_1         |  completed with 7 plugins.
rabbitmq_1         | 2021-01-30 15:50:30.539 [info] <0.730.0> Resetting node maintenance status

使用这些配置运行docker-compose up,如果我尝试访问HOST.com/rmq,则在浏览器控制台中会出现502 (Bad Gateway)错误。最初,这就是我卡住的地方。然而,在网上寻求帮助后,我发现了一种不同的方法来指定RabbitMQ容器标签上的traefik端口(traefik.http.services.rabbitmq.loadbalancer.server.port=15672)。通过这个修改,我不再有Bad Request错误,但是在浏览器控制台上我得到了很多ERR_ABORTED 404 (Not Found)错误(以下列表不包含所有错误):
rmq:7 GET http://HOST.com/js/ejs-1.0.min.js net::ERR_ABORTED 404 (Not Found)
rmq:18 GET http://HOST.com/js/charts.js net::ERR_ABORTED 404 (Not Found)
rmq:19 GET http://HOST.com/js/singular/singular.js net::ERR_ABORTED 404 (Not Found)

Refused to apply style from 'http://HOST.com/css/main.css' because its MIME type ('text/plain') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

rmq:27 Uncaught ReferenceError: sync_get is not defined at rmq:27

我对这类项目没有太多经验,不确定我是否做错了什么或者这些配置中是否缺少某些内容,或者虚拟机本身的配置是否有问题。你知道我该怎么做才能通过URL HOST.com/rmq 访问RabbitMQ UI吗?
如果我成功运行它,我认为我也可以配置Docker仅允许通过路由访问Traefik UI,例如HOST.com/dashboard,而不是只能通过没有任何路由的URL访问。
提前致谢!

嘿!我还没用过RMQ或Traefik,但根据我对其他反向代理的经验,我猜测你第二个配置能够将请求传递到RMQ,但是RMQ返回的HTML包含相对于根URL的绝对路径。你可能需要告诉RMQ将其路径重写为全部位于/rmq下。但是我不能确定,所以不敢给出确切答案。 - lahwran
@lahwran谢谢回复。我已经考虑过了,但是找不到实际操作的方法。你知道怎么做吗?或者至少能给我一个提示吗? - João Amorim
2个回答

2
解决了。我不知道为什么,但是当我使用配置traefik.http.services.rabbitmq.loadbalancer.server.port=15672时,我改变了行的顺序traefik.http.routers.rabbitmq.middlewares=strip-docstraefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq,让前缀出现在中间件之前。更改后,我现在可以访问HOST.com/rmq上的RabbitMQ UI。因此,我的最终docker-compose如下:
version: "3.5"
services:
  rabbitmq:
    image: rabbitmq:3-alpine
    expose:
      - 5672
      - 15672
    volumes:
      - ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
    labels:
      - traefik.enable=true
      - traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
      # needed, when you do not have a route "/rmq" inside your container (according to https://dev59.com/Q7fna4cB1Zd3GeqPx73-)
      - traefik.http.routers.rabbitmq.middlewares=strip-docs
      - traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
      - traefik.http.services.rabbitmq.loadbalancer.server.port=15672
    networks:
      - proxynet

  traefik:
    image: traefik:2.1
    command: --api=true     # Enables the web UI
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
    ports:
      - 80:80
      - 443:443
    labels:
      traefik.enable: true
      traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
      traefik.http.routers.traefik.service: "api@internal"
    networks:
      - proxynet

我将标记此问题为已解决,但如果您知道这两行代码的顺序为什么很重要,请解释一下以供日后参考。
谢谢!

0

追踪我确定这个问题的答案建议的过程,尽管我没有使用特定的工具:

通过搜索 rabbitmq admin url,我找到了 rabbitmq 管理文档页面,在页面顶部附近提到了一个路径前缀设置。我在页面上搜索了这个设置,在相关标题下发现你可能需要在你的 rabbitmq 配置中设置该设置:

management.path_prefix = /rmq

那么,为了将它应用于您的Docker配置中,我查找了rabbitmq docker image,其中讨论了配置文件需要通过绑定挂载注入,或者可以通过一个我个人不愿意去处理的奇怪的erlang配置事物来提供。因此,从这里开始我会按照以下步骤进行:

  1. 在现有的rabbitmq镜像中查找位于/etc/rabbitmq/rabbitmq.conf的默认配置文件,例如通过运行 docker-compose run rabbitmq cat /etc/rabbitmq/rabbitmq.conf 或者如果发现rabbitmq设置了docker ENTRYPOINT从而阻止在镜像命令行上使用shell命令,则使用适当的docker cp命令
  2. 添加一个卷,就像您使用已启用插件时所做的一样,但将其向上移动一个目录,并将rabbit/映射到/etc/rabbitmq/,然后将容器中的默认配置放在rabbit/中
  3. 将该行添加到配置文件中

希望这至少能让您更接近目标。我很想知道进展如何!

顺便说一下,在查看rabbitmq docker镜像文档时,我发现如果需要管理界面支持,有特殊的标签可供选择。你可能会发现,为了使其正常工作,你需要切换到其中一个标签,而不是使用普通的3-alpine,例如rabbitmq:3-management-alpine

1
我尝试添加一个卷- ./rabbit/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf,该文件具有以下配置:loopback_users.guest = false listeners.tcp.default = 5672 management.tcp.port = 15672 management.path_prefix = /rmq前三个配置是容器的默认配置(在添加此卷之前我进行了检查)。然而,现在浏览器显示主机重定向次数过多(ERR_TOO_MANY_REDIRECTS)。 - João Amorim
1
我还尝试了使用镜像rabbitmq:3-management-alpine,但结果是一样的。 - João Amorim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接