此 haproxy 配置终止 2 个站点(foo 和 bar)的 SSL,并将两个站点的负载平衡到它们自己的后端集群。它还将 http 请求重定向到 https。
效果很好。只是,如果后端关闭,它会进入两个站点的重定向循环。例如:https://foo.example.com->https://foo.example.com。
如果我删除重定向。它通过 http 和 https 为网站提供服务,当后端关闭时,它会像我预期的那样提供 503 页面。
我想将 http 重定向到 https。那么,为什么会出现重定向循环?
global
log 127.0.0.1 local0 debug
maxconn 1024
chroot /var/haproxy
uid 604
gid 604
daemon
pidfile /var/run/haproxy.pid
defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
maxconn 2000
errorfile 503 /etc/haproxy/503.http
frontend http
bind *:80
redirect scheme https code 301 if !{ ssl_fc }
frontend https
bind *:443 ssl crt /etc/ssl/example.com.pem
option forwardfor
reqadd X-Forwarded-Proto:\ https
http-response set-header Strict-Transport-Security "max-age=31536000;"
acl project_foo hdr(host) -i foo.example.com
acl project_bar hdr(host) -i bar.example.com
use_backend cluster_foo if project_foo
use_backend cluster_bar if project_bar
backend cluster_foo
server foo-1 foo-1.example.com:80 check
backend cluster_bar
server bar-1 bar-1.example.com:80 check
```
答案1
测试时,haproxy 和 nginx 位于同一台服务器上。foo-1.example.com 在专用 IP 上监听 80 端口,而 haproxy 监听 *:80
让 haproxy 在专用 IP 上监听解决了这个问题。所以,上面的配置没问题。我花时间重新测试了所有内容,因为我确实简化了配置以获得合理的可重现设置