У меня есть ситуация, когда у меня настроен балансировщик нагрузки с 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.