![haproxy 背后的 nginx - 无论提交什么域名,页面都会随机加载](https://linux22.com/image/761212/haproxy%20%E8%83%8C%E5%90%8E%E7%9A%84%20nginx%20-%20%E6%97%A0%E8%AE%BA%E6%8F%90%E4%BA%A4%E4%BB%80%E4%B9%88%E5%9F%9F%E5%90%8D%EF%BC%8C%E9%A1%B5%E9%9D%A2%E9%83%BD%E4%BC%9A%E9%9A%8F%E6%9C%BA%E5%8A%A0%E8%BD%BD.png)
我目前有一台运行 nginx 的 Web 服务器 (10.0.0.77),带有多个 vhost(几个 wordpress 网站和 nextcloud 安装),全部运行在 1 个 IP 地址上,并且所有内容都使用通配符证书进行保护。无论是内部还是外部,它都运行良好
现在我想通过 HAproxy 代理所有外部流量,下面是我针对一个 wordpres 站点和 nextcloud 的简化 haproxy 配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 15s
timeout client 15s
timeout server 15s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend localhost80
bind *:80
mode http
redirect scheme https code 301 if !{ ssl_fc }
frontend localhost443
bind *:443
option tcplog
mode tcp
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
acl is_wordpress req.ssl_sni -i nextcloud.domain.com
acl is_nextcloud req.ssl_sni -i wordpress.domain.com
use_backend nextcloud_cluster if is_nextcloud
use_backend wordpress_cluster if is_wordpress
backend wordpress_cluster
mode tcp
option ssl-hello-chk
server is_wordpress 10.0.0.77:443 check
backend nextcloud_cluster
mode tcp
option ssl-hello-chk
server is_nextcloud 10.0.0.77:443 check
问题是,一旦我重新指向外部流量通过我的 haproxy 运行,如果我尝试加载,即 nextcloud.domain.com,我有时会得到 wordpress.domain.com,反之亦然。
知道我哪里做错了吗?
答案1
当使用 SNI 区分后端时,您应该意识到在这种特定情况下非 SNI 客户端将无法访问站点。
但是,如果您的客户端没有问题,并且您仍然平衡到同一个后端(如示例中所示),那么您的配置中仍然有冗余信息。这里更简单的方法是:
frontend localhost443
bind *:443
option tcplog
mode tcp
default_backend backend1
backend backend1
mode tcp
option ssl-hello-chk
server server1 10.0.0.77:443 check
由于您的设置只是第 4 层平衡,如果您仍然获得随机网站,则必须更仔细地研究在 10.0.0.77:443 上运行的 Web 服务器:哪个 Web 服务器,它是如何设置的,直接访问时是否会产生同样的问题?