[英]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.