在 Aws Loadbalancer 后面使用 Traefik 进行 HTTPS 重定向
HTTPS-Redirect with Traefik behind Aws Loadbalancer
我正在尝试将所有传入的 Traefik 从 http 重定向到 https,用于从具有自定义端口的 docker 容器提供服务的 Web 应用程序。
如果我构建这个 docker 组合文件,并扩展应用程序,一切都会按预期进行。我能够请求应用程序的 http 和 https,但我尝试完成仅提供 https 服务并将 http 重定向到 https。
由于我使用 Docker-Compose 文件,所以我没有 Traefik.toml,并尝试在没有的情况下完成此操作。
Docker 撰写:
traefik:
image: traefik:latest
command:
- "--api"
- "--docker"
- "--docker.domain=example.com"
- "--logLevel=DEBUG"
- "--docker.watch"
labels:
- "traefik.enable=true"
ports:
- "80:80"
- "8080:8080"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
application:
image: application
command: web
tty: false
stdin_open: true
restart: always
expose:
- "8081"
labels:
- "traefik.backend=application"
- "traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.example.com"
- "traefik.frontend.priority=1"
- "traefik.enable=true"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
我尝试了应用程序容器的不同变体,例如:
- "traefik.frontend.entryPoints=http,https"
- "traefik.frontend.redirect.entryPoint=https"
- "traefik.frontend.headers.SSLRedirect=true"
但我最多只能完成许多重定向响应,带有 SSLRedirect 标签,如果没有我从 traefik 获得以下内容,http 或 https 请求都无法正确转发。
level=error msg="Recovered from panic in http handler: runtime error: invalid memory address or nil pointer dereference"
任何人都可以把我推向正确的方向吗?
提前致谢;)
我运行下面设置
user:~$ docker --version
Docker version 1.13.1, build 092cba3
user:~$ docker-compose --version
docker-compose version 1.8.0
Docker PS 回应
IMAGE COMMAND ... PORTS NAMES
application "dotnet Web..." ... 8081/tcp components_application_1
traefik:latest "/traefik --api --..." ... 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp components_traefik_1
基础设施设置
aws-elb => vpc => ec2...ecn
traefik per instance,
n applications per instance
这只在 traefik v1.7 之前有效,在 v2.* 之后你需要另一个配置设置,我还没有弄清楚
经过深入研究,我自己找到了解决方案。
问题是应用程序容器上缺少标签,
在我添加
之后
- "traefik.frontend.headers.SSLProxyHeaders=X-Forwarded-Proto: https"
- "traefik.frontend.headers.SSLRedirect=true"
在我的应用程序容器上,它具有清晰的 301 重定向,效果非常好。
为什么需要 header,默认情况下 aws-elb 接受 https 请求并使用 HTTP(80) 将其转发到连接的实例,在此过程中,elb 添加 X-Forwarded-Proto: https
Header 请求。
因为 traefik 不知道它在 elb 后面 运行 它会一遍又一遍地进行重定向。但是 Header 停止了这种行为。
我正在尝试将所有传入的 Traefik 从 http 重定向到 https,用于从具有自定义端口的 docker 容器提供服务的 Web 应用程序。
如果我构建这个 docker 组合文件,并扩展应用程序,一切都会按预期进行。我能够请求应用程序的 http 和 https,但我尝试完成仅提供 https 服务并将 http 重定向到 https。
由于我使用 Docker-Compose 文件,所以我没有 Traefik.toml,并尝试在没有的情况下完成此操作。
Docker 撰写:
traefik:
image: traefik:latest
command:
- "--api"
- "--docker"
- "--docker.domain=example.com"
- "--logLevel=DEBUG"
- "--docker.watch"
labels:
- "traefik.enable=true"
ports:
- "80:80"
- "8080:8080"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
application:
image: application
command: web
tty: false
stdin_open: true
restart: always
expose:
- "8081"
labels:
- "traefik.backend=application"
- "traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.example.com"
- "traefik.frontend.priority=1"
- "traefik.enable=true"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
我尝试了应用程序容器的不同变体,例如:
- "traefik.frontend.entryPoints=http,https"
- "traefik.frontend.redirect.entryPoint=https"
- "traefik.frontend.headers.SSLRedirect=true"
但我最多只能完成许多重定向响应,带有 SSLRedirect 标签,如果没有我从 traefik 获得以下内容,http 或 https 请求都无法正确转发。
level=error msg="Recovered from panic in http handler: runtime error: invalid memory address or nil pointer dereference"
任何人都可以把我推向正确的方向吗?
提前致谢;)
我运行下面设置
user:~$ docker --version
Docker version 1.13.1, build 092cba3
user:~$ docker-compose --version
docker-compose version 1.8.0
Docker PS 回应
IMAGE COMMAND ... PORTS NAMES
application "dotnet Web..." ... 8081/tcp components_application_1
traefik:latest "/traefik --api --..." ... 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp components_traefik_1
基础设施设置
aws-elb => vpc => ec2...ecn
traefik per instance,
n applications per instance
这只在 traefik v1.7 之前有效,在 v2.* 之后你需要另一个配置设置,我还没有弄清楚
经过深入研究,我自己找到了解决方案。
问题是应用程序容器上缺少标签, 在我添加
之后- "traefik.frontend.headers.SSLProxyHeaders=X-Forwarded-Proto: https"
- "traefik.frontend.headers.SSLRedirect=true"
在我的应用程序容器上,它具有清晰的 301 重定向,效果非常好。
为什么需要 header,默认情况下 aws-elb 接受 https 请求并使用 HTTP(80) 将其转发到连接的实例,在此过程中,elb 添加 X-Forwarded-Proto: https
Header 请求。
因为 traefik 不知道它在 elb 后面 运行 它会一遍又一遍地进行重定向。但是 Header 停止了这种行为。