尝试将Traefik设置为node.js和nginx的反向代理

时间:2019-12-17 03:23:43

标签: node.js docker docker-compose traefik

我正在尝试将Traefik设置为一个简单的Node.js微服务的反向代理,该微服务将由Angular前端调用,该前端将转换为javascript,css和html并在nginx上运行。现在,我正在尝试让Node.js在端口3000上进行内部侦听,并在外部traefik的暴露端点上可访问。

我可以访问仪表板和whoami示例服务,但不能访问Node.js微服务中定义的endpopints。我得到与PathPrefix匹配的端点的“错误网关”。如果我尝试到达与模式不匹配的端点,则会得到404“找不到页面”,因此我认为我正确设置了PathPrefix,只是没有服务设置和/或后端与前端配对。

当在Traefik外部调用时,我的微服务可以正常工作。我已经从Node.js脚本中删除了证书和SSL / TLS的处理,以便Traefik可以处理该部分。我对此部分也很有信心。

如果您访问“ /”,我的Node.js会显示“ Hello,world”,如果您进入/ v1 / api / authorize,则我的Node.js会进行实际工作。同样,仅当作为独立的node.js应用程序运行时,否则作为docker服务堆栈中的服务。

我想念什么?是什么导致“错误的网关”错误?我觉得这将是一个简单的解决方案,对于Traefik来说,这似乎是一个简单的用例。

我正在使用Node.js 10和Traefik 2.1.0。

version: "3.3"

services:
  reverse-proxy:
    image: "traefik:latest"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.web-secure.address=:443
      - --providers.docker=true
      - --api.insecure
      - --providers.file.directory=/configuration/
      - --providers.file.watch=true
      - --log.level=DEBUG
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/home/cliffm/dev/traefik/configuration/:/configuration/"

  auth-micro-svc:
    image: "auth-micro-svc:latest"
    labels:
      - traefik.port=3000
      - "traefik.http.routers.my-app.rule=Path(`/`)"
      - "traefik.http.routers.my-app.rule=PathPrefix(`/v1/api/`)"
      - "traefik.http.routers.my-app.tls=true"

  whoami:
    image: containous/whoami:latest

  redis:
    image: redis:latest
    ports:
      - "6379:6379"

1 个答案:

答案 0 :(得分:1)

晚了聚会,但至少在这里您要覆盖配置:

- "traefik.http.routers.my-app.rule=Path(`/`)"
- "traefik.http.routers.my-app.rule=PathPrefix(`/v1/api/`)"

第二行覆盖底行,因此第一行实际上被忽略。即使它同时适用于这两个规则,它们也是唯一的。 Path(/)的意思是显式/不带后缀,因此/ bla将不匹配,/ v1 / api也不会匹配,即使它与第二个规则匹配也是如此

对于多个规则,您可以使用这种方法:

- "traefik.http.routers.my-app.rule=Host(`subdomain.yourdomain.com`) && PathPrefix(`/v1/api`)"