从 Traefik 中找不到 404

问题描述 投票:0回答:1

我正在将 Traefik 设置为一堆 Docker 服务的反向代理。以下是我运行 Traefik 的方式:

services:
  traefik:
    image: traefik:v3.0.4
    container_name: traefik
    command:
      # Set log level to debug
      - --log.level=DEBUG
      # Enable Docker provider
      - --providers.docker=true
      # Do not expose containers unless explicitly told so
      - --providers.docker.exposedByDefault=false
      # Enable File provider
      - --providers.file=true
      # Specify the self-signed key configuration
      - --providers.file.filename=/conf/tls.yml
      # Traefik will listen to incoming request on port 80 (HTTP)
      - --entryPoints.web.address=:80
      # Traefik will listen to incoming request on port 443 (HTTPS)
      - --entryPoints.websecure.address=:443
      # Redirect HTTP traffic to HTTPS
      - --entrypoints.web.http.redirections.entryPoint.to=websecure
      - --entrypoints.web.http.redirections.entryPoint.scheme=https
      - --entrypoints.web.http.redirections.entrypoint.permanent=true
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/certs
      - ./conf:/conf
    networks:
      - proxy

networks:
  proxy:
    name: proxy

Traefik 启动并运行后,我添加了我的第一个 Web 应用程序,并且 我成功地从浏览器打开了该应用程序。然后我添加了第二个和第三个网络应用程序,但在它们上都找不到 404。以下是我运行其中一个的方式:

services:
  portainer:
    image: portainer/portainer-ce:2.20.2
    container_name: portainer
    restart: unless-stopped
    labels:
      # Explicitly tell Traefik to expose this container
      - traefik.enable=true
      # The domain the service will respond to
      - traefik.http.routers.portainer.rule=Host(`portainer.somedomain.lan`)
      # Allow request only from the predefined entry point named "websecure" (HTTPS on port 443)
      - traefik.http.routers.portainer.entrypoints=websecure
      - traefik.http.routers.portainer.tls=true
      # Specify which port Traefik should use for communicating to the service
      - traefik.http.services.portainer.loadbalancer.server.port=9000
    volumes:
      - portainer-data:/data
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - proxy

volumes:
  portainer-data:

networks:
  proxy:
    name: proxy
    external: true

当我进行卷曲时,我得到以下信息:

# HTTP
$ curl -ki portainer.somedomain.lan
HTTP/1.1 301 Moved Permanently
Location: https://portainer.somedomain.lan/
Date: Wed, 31 Jul 2024 15:27:45 GMT
Content-Length: 17

Moved Permanently

这是预料之中的,因为我如何设置 Traefik 将 HTTP 流量重定向到永久移动的 HTTPS。但是,当我使用 https 执行卷曲时:

# HTTPS
$ curl -ki https://portainer.somedomain.lan
HTTP/2 404 
content-type: text/plain; charset=utf-8
x-content-type-options: nosniff
content-length: 19
date: Wed, 31 Jul 2024 15:31:14 GMT

404 page not found
http-redirect https reverse-proxy traefik
1个回答
0
投票

我已将您的 traefik 和 portainer 设置一起复制到 docker-compose 文件中并成功运行。您的问题一定出在其他地方。

您是否事先运行了 portainer 并单击了“仅强制 HTTPS”设置? 在这种情况下,您需要更正您的 traefik 服务以指向 9443。

无论如何,我建议您尝试以下操作,看看端口 9000 是否是问题所在:

- traefik.http.services.portainer.loadbalancer.server.port=9443
- traefik.http.services.portainer.loadbalancer.server.scheme=https

或者,您可能想放弃 portainer 数据卷并尝试使用干净的状态。

您可能遇到的问题是,您在第一个 docker compose 文件中引用网络“代理”,并在第二个文件中定义它。以错误的顺序启动或停止这些会导致问题。

创建静态 docker 网络来避免这种情况:

docker network create proxy
© www.soinside.com 2019 - 2024. All rights reserved.