Назад | Перейти на главную страницу

как настроить HAProxy как обратный прокси?

У меня несколько веб-серверов, на которых размещено несколько доменов. Иногда мне нужно переместить домен с одного веб-сервера на другой. Вместо того, чтобы обновлять DNS для домена, чтобы он указывал на новое расположение сервера, я хотел бы настроить все домены так, чтобы они указывали на обратный прокси (?), Который затем будет передавать веб-запросы на правильные серверы. Я пытаюсь использовать haproxy для достижения этой цели, но без особого успеха.

Например:

Есть два сервера: web1.foo.com и web2.foo.com. web1 обслуживает сайты для abc.com и def.com. web2 обслуживает сайты cba.com и fed.com.

есть также прокси-сервер proxy.foo.com.

DNS для abc.com и т. д. указываются на 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

Да, то, как вы все настроили, по сути, сбалансирует нагрузку всех входящих соединений между внутренними серверами.

По сути, вам нужно одно определение бэкэнда для каждого реального веб-сервера. Я думаю, что суть того, что вам нужно, - это несколько определений бэкэнда, по одному для каждого реального веб-сервера. Затем в разделе внешнего интерфейса вы захотите использовать различные условные выражения, чтобы использовать связанный серверный интерфейс для любого запрошенного 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.