2

我目前正在做一个项目,我在 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://stackoverflow.com/questions/59054551/how-to-map-specific-port-inside-docker-container-when-using-traefik)
      - 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"

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)错误。最初,这就是我卡住的地方。traefik.http.services.rabbitmq.loadbalancer.server.port=15672但是,在网上搜索了一些帮助后,我发现了一种在 RabbitMQ 容器标签(我的浏览器控制台上出现404(未找到)错误(下面的列表不包含所有错误):

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 配置为只允许使用诸如HOST.com/dashboard之类的路由访问 Traefik UI ,而不是仅使用没有任何路由的 URL 访问它。

提前致谢!

4

2 回答 2

2

解决了。我不知道为什么,但是当我使用配置时traefik.http.services.rabbitmq.loadbalancer.server.port=15672,我改变了行的顺序traefik.http.routers.rabbitmq.middlewares=strip-docs和,traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq使. 改变了这一点,现在我可以访问 RabbitMQ UI 了。所以我的决赛是这样的:prefixmiddlewareHOST.com/rmqdocker-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://stackoverflow.com/questions/59054551/how-to-map-specific-port-inside-docker-container-when-using-traefik)
      - 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

我会将这个问题标记为已解决,但如果您知道为什么这两行的顺序很重要,请解释一下以供将来参考。

谢谢!

于 2021-01-31T11:08:08.670 回答
0

鉴于我没有使用特定工具,我如何确定为这个问题提出建议的答案:

通过搜索rabbitmq admin url,我找到了 rabbitmq 管理文档页面,该页面靠近顶部,提到了对path prefix设置的支持。我搜索了该页面,并在相关标题下,发现您可能需要在 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 image docs 时,我发现如果你需要管理接口支持,有一些特殊的标签。您可能会发现您需要切换到其中一个而不是简单3-alpine的才能使其正常工作,例如rabbitmq:3-management-alpine.

于 2021-01-30T22:03:26.587 回答