簡體   English   中英

Traefik 和 Nginx 在 Docker 上使用 HTTPS / 400 錯誤請求

[英]Traefik and Nginx with HTTPS on Docker / 400 Bad Request

我正在嘗試使用基於 Docker 的 Traefik 和 Nginx 構建堆棧。 沒有 HTTPS 一切都很好,但是一旦我進行了 HTTPS 配置,我就會收到錯誤消息。

我在example.com上從 Nginx 收到此錯誤: 400 錯誤請求/純 HTTP 請求已發送到 HTTPS 端口。 在地址欄中,我可以看到表示連接安全的綠色鎖。

Certbot 工作正常,所以我在正確的文件夾中有真正的 SSL 證書。

當我訪問 traefik.example.com 時,我可以訪問traefik.example.com但我必須接受沒有 SSL 瀏覽器警告,而且 dasboard 也可以在沒有 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

配置文件

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;
}

謝謝你的幫助。

首先,不需要在 Traefik 和 Nginx 中配置 SSL 重定向。 此外,Traefik 前端僅匹配non www變體,但后端應用程序需要www 最后 Traefik web提供程序已被棄用,因此應該有更新的api提供程序。

因為我偶然發現了與 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 這不是一個解決方案,因為這些端口現在可供外界使用,但我將這個解釋留在這里,因為我找不到關於這個主題的任何東西,可以為我指明正確的方向,所以希望以后對其他人有幫助.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM