我目前有一个 HAProxy 负载均衡器,没有 SSL 终止,它将流量路由到几个 Web 服务器。在 Web 服务器上,nginx 终止 SSL,理论上提供 http 到 https 的重定向。但是,当在浏览器中请求 http 时,它不会重定向,而是抛出“400 错误请求”错误,表示普通的 http 请求已发送到 https 端口。知道我在这里做错了什么吗?
nginx 配置文件示例:
server {
listen private.ip:80;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
return 301 https://$host$request_uri;
}
server {
listen private.ip:443 ssl;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
# rest of config
}
我相信 HAProxy 配置的相关部分是这样的(存在一些 ansible 变量,但你明白了)...
frontend http
bind my_ip:80
bind my_ip:443
option tcplog
mode tcp
default_backend app_pool
backend app_pool
mode tcp
balance roundrobin
option ssl-hello-chk
{% for server in backend_webservers %}
server {{ server.name }} {{ server.ip }}:443 check
{% endfor %}
答案1
根据您的配置,即使请求是在端口 80 上接收的 HTTP 流量,HAProxy 也会将请求路由到 443 端口。
处理此问题的最佳方法是在 HAProxy 上配置 http 到 https 的重定向,而不是在后端。因此,您必须将以下内容添加到 HAProxy 前端:
重定向方案 https 代码 301 if !{ ssl_fc }