我有一个 haproxy 设置,其中有几个 haproxy 服务器路由到应用程序服务器集群。我希望 haproxy 执行所有 ssl 终止。
目前 https 请求以 https 形式转发到应用服务器。因此我想要的是:
user <-https-> Haproxy <-http-> Application
user <-http-> Haproxy <-http-> Application
我见过一些配置,它们都是使用 haproxy 强制用户将方案升级到 https,然后整个系统都通过 https。这不是我想要的 - 我想让应用服务器始终处于 http 状态。
答案1
我想我找到了答案:
defaults
option forwardfor
option http-server-close
frontend www-http
bind :80
reqadd X-Forwarded-Proto:\ http
default_backend my-backend
frontend www-https
bind :443 ssl crt /etc/haproxy/ssl/oroboro.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend my-backend
在默认值中添加这两个选项。forwardfor 添加 X-Forwarded-For 标头。
然后创建两个前端,一个绑定到 http,另一个绑定到 https,这就是绑定行的作用。在 https 前端,我们放置了 SSL 解密的参数。之后,haproxy 将通过 http 转发请求。
X-Forwarded-Proto 标头的作用是你的应用服务器可以知道用户正在使用什么协议,以防你想为非 https 用户生成不同的页面(例如不呈现某些内容)