gpt4 book ai didi

docker - 尝试在Traefik上配置HTTPS时获取502 Bad Gateway

转载 作者:行者123 更新时间:2023-12-02 19:15:26 32 4
gpt4 key购买 nike

我有一个适用于HTTP here的基本Traefik 2设置...
现在,我正在尝试使HTTPS正常工作,并使用TLS和重定向对仪表板进行基本身份验证...
docker_compose.yml :

version: '3.8'
networks:
myweb:
external: true

services:
proxy:
image: traefik:v2.3.0-rc4-windowsservercore-1809
container_name: traefik
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
# Mount the certs drive
- ./traefik-ssl-certs/:c:/certs/
# Mount the config folder
- ./traefik-config/:c:/config/
# Mount the host docker engine pipe ("docker volume ls")
- source: '\\.\pipe\docker_engine'
target: '\\.\pipe\docker_engine'
type: npipe
command:
- "--api.insecure=true"

# Register the traefik config directory as per: https://docs.traefik.io/providers/file/#directory
- --providers.file.directory=c:/config/
- --providers.file.watch=true

- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443

# Redirect http to https
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entrypoints.web.http.redirections.entrypoint.permanent=true

# Configure Docker provider
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.endpoint=npipe:////./pipe/docker_engine"
- "--providers.docker.network=myweb"
- "--providers.docker.watch=true"
networks:
- myweb
labels:
- traefik.http.routers.api.service=api@internal
- traefik.enable=true
- traefik.docker.network=myweb


remoteling:
image: remoteling:latest
container_name: remoteling
networks:
- myweb
labels:
- traefik.enable=true
- traefik.docker.network=myweb

- traefik.http.middlewares.http2https.redirectscheme.scheme=https
- traefik.http.routers.remoteling-http.middlewares=http2https
- traefik.http.routers.remoteling-http.rule=Host(`example.com`) || Host(`example.example.com`)
- traefik.http.routers.remoteling-http.entrypoints=web

- traefik.http.services.remoteling.loadbalancer.server.port=443
- traefik.http.routers.remoteling-https.rule=Host(`example.com`) || Host(`example.example.com`)
- traefik.http.routers.remoteling-https.entrypoints=websecure
- traefik.http.routers.remoteling-https.tls=true
depends_on:
- proxy
从powershell我正在运行:
docker network create -d nat myweb
docker-compose -p myweb up
在我的工作目录中,我具有以下文件结构:
  • ./docker-compose.yml
  • ./traefik-config/traefik.yml
  • ./traefik-ssl-certs/example.com.crt
  • ./traefik-ssl-certs/example.com.key
  • ./traefik-ssl-certs/example.example.com.key
  • ./traefik-ssl-certs/example.example.com.key

  • traefik.yml文件如下所示:
    tls:
    certificates:
    - certFile: c:/certs/example.example.com.crt
    keyFile: c:/certs/example.example.com.key
    - certFile: c:/certs/example.com.crt
    keyFile: c:/certs/example.com.key
    traefik仪表板显示我的服务定义为负载均衡器,这很好((除了负载均衡器之外,还有其他任何类型的服务吗?除了通过负载均衡器之外,我不确定如何定义其他端口)。单击该服务会为我提供本地网络IP-以及 ,当我访问该IP时,我的站点会加载正确的(尽管预期会出现SSL证书不匹配警告)。
    但是,当我尝试访问 https://example.comhttps://example.example.com- 时,我得到了502错误的网关。知道为什么我会得到这个吗?
    浏览器显示SSL证书有效,没有警告,因此我认为我的证书配置很好。
    http到https重定向似乎有效,如果我访问 http://example.com,它将转发给 https://example.com
    导致这些错误网关的路由配置有什么问题?

    最佳答案

    我已经解决了我的问题!有几个问题:

  • 我在Dockerfile中配置了TLS证书,这是从我在服务器上将镜像作为单个服务运行时开始的。因此,我的镜像已经具有与TLS证书绑定(bind)的端口443。我认为这在Traefik路由器尝试为服务配置TLS时引起了问题。因此,我必须重建镜像,删除TLS。我也删除了需要HTTPS属性的代码,这就是traefik的职责。

  • 镜像仅需要公开1个端口:我现在的理解是,我的Web应用程序应仅通过端口80运行(例如,甚至不需要在镜像的防火墙中公开端口443),并且Traefik路由器通过以下方式配置和处理TLS / 443等:端口80。
  • 我实际上没有正确定义HTTP和HTTPS服务。我在下面共享了docker-compose.yml文件-有关traefik和其他服务的注意事项,我将标签分为以下几部分:定义服务,HTTP路由,HTTPS路由,重定向中间件以及traefik仪表板的基本身份验证。我找不到任何能很好地分解traefik 2.0必要方面并进行清晰分类的优秀文档或教程。

  • 服务定义标签/负载平衡器端口应指向托管镜像服务的任何端口,例如在大多数情况下,或者在traefik服务8080的情况下,端口80。但是至关重要的是,https也不必指向443。
    总而言之,我的(详细的)学习笔记是,您需要:
  • 再次将服务定义为标签:没有服务定义标签对我不起作用。我必须添加一个服务标签,该服务标签指向在其下定义镜像的服务的名称。
  • 为http和https定义路由器:无论您在traefik.http.routers.YOUR_ROUTER_NAME之后输入什么文本,都将成为您的路由器。我不清楚我是否需​​要为http和https设置单独的路由器。您必须为每种服务(例如traefik,whoami,远程控制等)执行此操作
  • 定义路由器的入口点:AFAIK在traefik命令中的入口点后面放置的名称定义了可以用于其他服务的新入口点。因此,在traefik服务定义中,您将具有--entrypoints.WEBNAME.address =:80和--entrypoints.WEBSECURENAME.address =:443(用您自己的名称替换这些大写字母,以便在整个docker-compose.yml文件中使用。
  • 定义要捕获的路由器域名:就像您为每个http和https定义路由器一样,您必须为这两个路由器定义要捕获的域,甚至是相同的域/路径。
  • 为https路由器添加tls:对于https路由器,您需要tls.true标签。
  • traefik和您的每个服务的单独的中间件重定向定义:我读到可以声明一个全局的,但是AFAIK每个服务都必须通过将中间件分配给http路由器来选择加入。
  • 在Docker for Windows上提供自己的SSL证书:关于使用自己的SSL证书运行Docker for Windows的信息很少。我的“traefik”工作目录中有一个批处理脚本,其子文件夹包含SSL证书(crt和密钥文件)。我将其安装为第一个卷- ./traefik-ssl-certs/:c:/certs/。然后,在工作目录中,我有另一个名为traefik-config的文件夹,其中包含我的traefik.yml文件(上述问题的详细信息)。在Linux中,每个人似乎都只是直接挂载配置文件,但是挂载文件在Windows中不起作用,因此我不得不挂载为文件夹,然后我使用了providers.file.directory=c:/config/命令,该命令告诉traefik在其中查找配置文件。配置文件提供了traefik加载的SSL证书的位置。如果为路由器启用TLS,Traefik将自动使用与您在该路由器上指定的域匹配的任何证书。
  • 基本身份验证:必须将中间件定义为一个标签,然后将该中间件分配给您的https路由器。而且我想,如果您不使用HTTPS重定向,则可以将其分配给您的http路由器,但这显然不安全。

  • docker-compose.yml:
    version: '3.8'
    networks:
    myweb:
    external: true

    services:
    proxy:
    image: traefik:v2.3.0-rc4-windowsservercore-1809
    container_name: traefik
    ports:
    - "80:80"
    - "443:443"
    - "8080:8080"
    volumes:
    # Mount the certs drive
    - ./traefik-ssl-certs/:c:/certs/
    # Mount the config folder
    - ./traefik-config/:c:/config/
    # Mount the host docker engine pipe ("docker volume ls")
    - source: '\\.\pipe\docker_engine'
    target: '\\.\pipe\docker_engine'
    type: npipe
    command:
    - --api=true
    - --api.dashboard=true
    - --api.insecure=false

    # Register the traefik config directory as per: https://docs.traefik.io/providers/file/#directory
    - --providers.file.directory=c:/config/
    - --providers.file.watch=true

    - --entrypoints.web.address=:80
    - --entrypoints.websecure.address=:443

    # Configure Docker provider
    - --providers.docker=true
    - --providers.docker.exposedbydefault=false
    - --providers.docker.endpoint=npipe:////./pipe/docker_engine
    - --providers.docker.network=myweb
    - --providers.docker.watch=true
    networks:
    - myweb
    labels:
    - traefik.enable=true
    - traefik.docker.network=myweb

    # Define the service
    - traefik.http.services.proxy.loadbalancer.server.port=8080

    # Routing for dashboard HTTP
    - traefik.http.routers.dash-http.service=api@internal
    - traefik.http.routers.dash-http.rule=Host(`example.com`)
    - traefik.http.routers.dash-http.entrypoints=web

    # Routing for dashboard HTTPS
    - traefik.http.routers.dash-https.service=api@internal
    - traefik.http.routers.dash-https.rule=Host(`example.com`)
    - traefik.http.routers.dash-https.entrypoints=websecure
    - traefik.http.routers.dash-https.tls=true

    # Http-to-Https redirect Middleware
    - traefik.http.middlewares.dash-http2https.redirectscheme.scheme=https
    - traefik.http.middlewares.dash-http2https.redirectscheme.permanent=true
    - traefik.http.routers.dash-http.middlewares=dash-http2https

    # BasicAuth for dashboard
    # Windows doesn't have htpasswd command so I generated one here: https://hostingcanada.org/htpasswd-generator/
    # As per Traefik documentation, escaped single $ char with $$ for the yml parser
    # user/pass = admin/testpassword
    - traefik.http.middlewares.api-auth.basicauth.users=admin:$$2y$$10$$mfWQ11K16V6gVK.8Y6q1Eeh765NZscmjCrjJlAtaWubEsjU8HLYOO
    - traefik.http.routers.dash-https.middlewares=api-auth

    remoteling:
    image: remoteling:latest
    container_name: remoteling
    networks:
    - myweb
    labels:
    - traefik.enable=true
    - traefik.docker.network=myweb

    # Define the service
    - traefik.http.services.remoteling.loadbalancer.server.port=80

    # Routing for remoteling HTTP
    - traefik.http.routers.remoteling-http.service=remoteling
    - traefik.http.routers.remoteling-http.entrypoints=web
    - traefik.http.routers.remoteling-http.rule=Host(`services.example.com`)

    # Routing for remoteling HTTPS
    - traefik.http.routers.remoteling-https.service=remoteling
    - traefik.http.routers.remoteling-https.entrypoints=websecure
    - traefik.http.routers.remoteling-https.rule=Host(`services.example.com`)
    - traefik.http.routers.remoteling-https.tls=true

    # Http-to-Https redirect Middleware
    - traefik.http.middlewares.remoteling-http2https.redirectscheme.scheme=https
    - traefik.http.middlewares.remoteling-http2https.redirectscheme.permanent=true
    - traefik.http.routers.remoteling-http.middlewares=remoteling-http2https
    depends_on:
    - proxy
    希望其他人发现它有用。

    关于docker - 尝试在Traefik上配置HTTPS时获取502 Bad Gateway,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770377/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com