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

Обслуживание нескольких сайтов с помощью Apache Proxy Balancer

У меня есть ситуация, когда у меня настроен балансировщик нагрузки с Apache2 и балансировщик мод, который будет балансировать нагрузку на два веб-сервера Apache2. Я бы хотел, чтобы мой балансировщик нагрузки мог обслуживать несколько сайтов, но в настоящее время каждый виртуальный хост, который я создаю, обслуживает один и тот же сайт.

На балансировщике нагрузки (lb1) у меня есть default виртуальный хост включен, поэтому при переходе к IP-адресу балансировщика нагрузки вы видите стандартное сообщение Apache2.

Ниже приведен макет виртуального хоста, который я использую для всех последующих доменов, которые может обслуживать балансировщик нагрузки (замените mydomain.com для фактического доменного имени, конечно):

<VirtualHost *>
        ServerName www.mydomain.com
        ServerAlias mydomain.com

        ProxyRequests Off

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        <Proxy balancer://mydomain.com.cluster>
                BalancerMember http://web1.mycluster.com:80 route=web1 retry=5
                BalancerMember http://web2.mycluster.com:80 route=web2 retry=5
                ProxySet lbmethod=byrequests
        </Proxy>

        ProxyPass / balancer://mydomain.com.cluster/ stickysession=BALANCEID n$

        ProxyPassReverse / http://web1.mycluster.com/
        ProxyPassReverse / http://web2.mycluster.com/
</VirtualHost>

Это то, что виртуальный хост на веб-сервере (web1 & web2) конец похож. На обоих веб-серверах включены одни и те же виртуальные хосты. Единственное различие между виртуальными хостами - это ссылка на web1 или web2 соответственно (я показываю виртуальный хост web1 Вот):

<VirtualHost *>
        ServerName www.mydomain.com
        ServerAlias mydomain.com

        RewriteEngine On
        RewriteRule .* - [CO=BALANCEID:balancer.web1:.mydomain.com]

        DocumentRoot /mnt/share/mydomain.com/www/public_html

        <Directory />
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

Кажется, это работает для mydomain.com. Если я создам другой виртуальный хост с тем же макетом, например. для myotherdomain.com затем просматривая myotherdomain.com действительно будет служить mydomain.com.

Что я делаю не так?

Вам, вероятно, где-то понадобится директива NameVirtualHost, иначе запросы будут соответствовать только IP-адресу сервера, и первый VirtualHost, который соответствует этому IP-адресу, «выиграет» (так что первый всегда выигрывает).

По крайней мере, это работало так много лет назад, когда я больше имел дело с Apache.

Ячек Конечны был прав, и я наконец понял, в чем проблема. Я хотел бы немного подробнее остановиться на этом. Похоже, это было связано с тем, как я настраивал свои виртуальные хосты, и он всегда выбирал хост по умолчанию на любом из серверов с балансировкой нагрузки. Вот как я настраиваю свои виртуальные хосты:

Для виртуального хоста по умолчанию:

NameVirtualHost *:80
<VirtualHost *:80>

  # vhost stuff

</VirtualHost>

Затем для других виртуальных хостов:

<VirtualHost *:80>
  ServerName mydomain.com
  ServerAlias www.mydomain.com

  # forward proxy stuff

</VirtualHost>

Все узлы веб-сервера настроены так, как если бы они были автономными машинами, за исключением установленного файла cookie BALANCEID.