无法在AWS负载均衡器后面从http重定向到https

时间:2018-01-02 18:17:26

标签: traefik

我在一个带有牧场后端的AWS实例上运行traefik。我在AWS负载均衡器处终止SSL,并在端口80上与实例进行通信,该实例将:80流量转发到traefik容器。

所以负载均衡器目前有: https:443 ==> HTTP:80 http:80 ==> HTTP:80

这意味着,如果您输入https://example.com,则会获得SSL,如果您输入http://example.com,则只会获得普通的http连接。

希望通过http 302进行自动重定向 - 它会将http://example.com重定向到https://example.com

到目前为止,我尝试失败的原因如下:

** AWS负载均衡器**

https:443 => HTTP:80
http:80 => HTTP:81

traefik.toml
------------
[entryPoints]
  [entryPoints.http]
  address = ":81"
     [entryPoints.http.redirect]
     regex = "^http://example.com/(.*)"
     replacement = "https://example.com/$1"
  address = ":80"

docker-compose.yml
------------------
API-Proxy:
  container_name: api-proxy
  image: traefik
  volumes:
  - "/var/run/docker.sock:/var/run/docker.sock"
  - "$PWD/traefik.toml:/etc/traefik/traefik.toml"
  command: "--web --rancher --docker.domain=rancher.localhost --logLevel=DEBUG"
  cpu_shares: 128
  restart: always
  ports:
  - 80:80/tcp
  - 81:81/tcp
  - 8100:8080/tcp

当我尝试通过端口80访问时,会出现超时。 Traefik日志似乎没有帮助。

这是一种愚蠢的做法吗?或者,使用Let's encrypt?

更好地在traefic容器上终止SSL

2 个答案:

答案 0 :(得分:2)

在Traefik配置中尝试这样的操作。然后将LB上的端口443和80转发到Traefik上的端口80。

(py35x64_test) E:\Work\Dev\StackOverflow\q048571060>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <_1ELEMENT0> text 1ELEMENT0 </_1ELEMENT0>
    <ELEMENT0> text ELEMENT0 </ELEMENT0>
    <_11ELEMENT1> text 11ELEMENT1 </_11ELEMENT1>
    <ELEMENT1> text ELEMENT1 </ELEMENT1>
</root>

_1ELEMENT0 - [ text 1ELEMENT0 ]
ELEMENT0 - [ text ELEMENT0 ]
_11ELEMENT1 - [ text 11ELEMENT1 ]
ELEMENT1 - [ text ELEMENT1 ]

答案 1 :(得分:1)

我目前在AWS上的Kubernetes中这样做。要做得恰到好处,这有点蠢,但这完全有可能。

首先,您需要确保您的ELB正在侦听端口80上的HTTP(而不是HTTPS)以及端口443上的HTTPS。如果ELB在端口80上侦听HTTPS,则会产生非常奇怪的行为客户端。先检查一下。 注意:如果您使用Helm部署了Traefik,则这是默认行为。

使用aws elb describe-load-balancers打印出所有ELB。你必须在那里找到ELB(我不知道如何告诉你它是哪一个)并查看LoadBalancerDescriptions[].ListenerDescriptions[].Listener.ProtocolInstanceProtocol以确保它们是{{1}分别和HTTPS

其次,您只需要HTTP

config.toml

说明:

  • 收听端口80
  • 为端口80上的任何流量设置永久重定向到端口8880
  • 使用HTTP侦听端口8880并启用gzip压缩

ELB应该将端口80映射到端口80,将端口443映射到端口8880.现在所有HTTP流量将自动重定向(使用 [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] regex = "^http://(.*)" replacement = "https://$1" [entryPoints.httpn] address = ":8880" compress = true 进行测试)到HTTPS并在ELB处终止并作为HTTP转发到Traefik。

我仍然在寻找一种在部署时为ELB侦听器指定协议的好方法,但除了在部署Traefik后通过AWS控制台手动更改它们之外,我还没有找到一个好的解决方案。