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

rad*_*lon 6 reverse-proxy haproxy

我有多个网络服务器,托管多个域。有时,我需要将域从一台 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
Run Code Online (Sandbox Code Playgroud)

Rya*_*ger 5

是的,您配置的方式本质上将负载平衡后端服务器之间的所有传入连接。

您想要的基本上是每个真实 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
Run Code Online (Sandbox Code Playgroud)

请注意mode http. 我相信这是实际执行诸如基于 HTTP 标头做出决策之类的事情所必需的。

当需要将哪些 URL 移动到哪个后端时,只需更新配置文件并对 haproxy 进行软重新加载即可。

  • 这为我指明了正确的方向,谢谢!我能够像我需要的那样将其全部设置并工作...深入研究文档,我找到了一种使其更易于管理的方法: `acl foo_backend hdr_dom(host) -i -f /etc/haproxy /domain_routing/foo_domains.txt acl bar_backend hdr_dom(host) -i -f /etc/haproxy/domain_routing/bar_domains.txt use_backend foo if foo_backend use_backend bar if bar_backend` 那么我只是将每个后端的域列表放在文本中文件,使事情变得漂亮、整洁且易于管理:) 再次感谢! (3认同)