我有多个 Web 服务器,托管多个域。有时,我需要将域从一个 Web 服务器移动到另一个。我不想更新域的 DNS 以指向新的服务器位置,而是想将所有域设置为指向反向代理 (?),然后将 Web 请求传递到正确的服务器。我尝试使用 haproxy 来实现这一点,但没有成功。
举个例子:
有两台服务器,web1.foo.com 和 web2.foo.com。web1 为 abc.com 和 def.com 提供网站服务。web2 为 cba.com 和 fed.com 提供网站服务。
还有一个代理服务器,proxy.foo.com。
abc.com 等的 dns 指向 proxy.foo.com,其配置为将域映射到服务器,如下所示:
abc.com -> web1.foo.com def.com -> web1.foo.com cba.com -> web2.foo.com fed.com -> web2.foo.com
问题是,我无法使用 haproxy 使其工作...它正在尝试负载平衡而不是反向代理...如果我访问 abc.com,它将在 web1 和 web2 之间循环。
所以,我想知道,使用 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
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
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 localhost
bind *:80
bind *:443
option tcplog
mode tcp
default_backend servers
backend servers
mode tcp
server abc.com web1.foo.com
server def.com web1.foo.com
server cba.com web2.foo.com
server fed.com web2.foo.com
答案1
是的,您配置的方式基本上会对后端服务器之间的所有传入连接进行负载平衡。
您需要的基本上是每个真实 Web 服务器的一个后端定义。我认为您想要的要点是多个后端定义,每个真实 Web 服务器一个。然后在您的前端部分,您需要使用各种条件来使用与请求的前端 URL 相关的后端。伪配置可能看起来像这样:
frontend localhost
mode http
use_backend web1 if { hdr(host) -i abc.com }
use_backend web1 if { hdr(host) -i def.com }
use_backend web2 if { hdr(host) -i cba.com }
use_backend web2 if { hdr(host) -i fed.com }
backend web1
server web1 web1.foo.com
backend web2
server web2 web2.foo.com
注意mode http
。我相信这实际上是根据 HTTP 标头做出决策所必需的。
当需要将哪些 URL 移动到哪些后端时,只需更新配置文件并对 haproxy 进行软重新加载即可。