У меня несколько веб-серверов, на которых размещено несколько доменов. Иногда мне нужно переместить домен с одного веб-сервера на другой. Вместо того, чтобы обновлять 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.