【问题标题】:Traefik and Nginx with HTTPS on Docker / 400 Bad RequestTraefik 和 Nginx 在 Docker 上使用 HTTPS / 400 错误请求
【发布时间】:2018-11-28 23:57:17
【问题描述】:

我正在尝试使用基于 Docker 的 Traefik 和 Nginx 构建堆栈。没有 HTTPS 一切都很好,但我一设置 HTTPS 配置就会出错。

我在example.com 上从 Nginx 收到此错误:400 Bad Request / The plain HTTP request was sent to HTTPS port. 在地址栏中,我可以看到绿色锁显示连接是安全。

Certbot 工作正常,所以我在正确的文件夹中有真正的 SSL 证书。

当我访问 traefik.example.com 时,我可以访问 Traefik 仪表板,但我必须接受没有 SSL 浏览器警告,并且仪表板在没有 HTTPS 的情况下也可以工作。

docker-compose.yml

version: '3.4'
services:
    traefik:
        image: traefik:latest
        ports:
            - "80:80"
            - "443:443"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./traefik/traefik.toml:/etc/traefik/traefik.toml
            - ../letsencrypt:/etc/letsencrypt
        labels:
            - traefik.backend=traefik
            - traefik.frontend.rule=Host:traefik.example.com
            - traefik.port=8080
        networks:
           - traefik
    nginx:
        image: nginx:latest
        volumes:
            - ../www:/var/www
            - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
            - ../letsencrypt:/etc/letsencrypt
        labels:
            - traefik.backend=nginx
            - traefik.frontend.rule=Host:example.com
            - traefik.port=80
            - traefik.port=443
        networks:
            - traefik
networks:
    traefik:
        driver: overlay
        external: true
        attachable: true

traefik.toml

defaultEntryPoints = ["http", "https"]

[web]
    address = ":8080"

[entryPoints]
    [entryPoints.http]
        address = ":80"
        [entryPoints.http.redirect]
            entryPoint = "https"
    [entryPoints.https]
        address = ":443"
        [entryPoints.https.tls]
            [[entryPoints.https.tls.certificates]]
                certFile = "/etc/letsencrypt/live/example.com/fullchain.pem"
                keyFile = "/etc/letsencrypt/live/example.com/privkey.pem"

[docker]
    domain="example.com"
    watch = true
    exposedByDefault = true
    swarmMode = false

nginx.conf

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl http2;

    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/public;
    index index.html;
}

感谢您的帮助。

【问题讨论】:

    标签: docker nginx https traefik


    【解决方案1】:

    首先不需要在 Traefik 和 Nginx 中配置 SSL 重定向。 Traefik 前端仅匹配 non www 变体,但后端应用程序需要 www。最后,Traefik web 提供程序已被弃用,因此应该有更新的api 提供程序。

    【讨论】:

      【解决方案2】:

      我刚刚偶然发现了 Traefik v2 的类似问题

      400 Bad Request / The plain HTTP request was sent to HTTPS port
      

      带有 Nginx 错误日志说明

      400 client sent plain HTTP request to HTTPS port while reading client request headers
      

      我摸不着头脑,终于找到了错误的根源。不是 TLS 证书无效或传输中的某些内容损坏,而是路由器、服务和端口映射之间的连线断开。

      以前我没有看到,Docker Compose 堆栈有一个 Nginx 容器只监听 80/tcp。我假设一切正常,因为我将端口连接到 Traefik 负载均衡器,该负载均衡器连接到每个带有单独路由器的 http/https 端点的单独服务。这不知何故不起作用:

      - "traefik.http.services.proxy.loadbalancer.server.port=80"
      - "traefik.http.services.proxy-secure.loadbalancer.server.port=443"
      

      中介 我现在打开了port: - "8008:80" - "8443:443" 并开始工作。进一步调查 Traefik 端口出了什么问题,因为默认情况下这些端口应该得到 exposed。这不是一个解决方案,因为这些端口现在可供外部世界使用,但我在这里留下了这个解释,因为我找不到任何关于这个主题的东西可以为我指明正确的方向,所以希望稍后对其他人有帮助.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 2020-06-06
        • 2015-06-17
        • 2017-05-28
        • 2014-08-03
        • 2019-10-03
        • 1970-01-01
        相关资源
        最近更新 更多