如何将 HAProxy 配置为反向代理?

如何将 HAProxy 配置为反向代理?

我有多个 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 进行软重新加载即可。

相关内容