VirtualHost по умолчанию неверное развертывание при перезагрузке
У нас есть сервер под управлением семи доменов / поддоменов. Чтобы попытаться сделать здесь как можно меньше, я включу четыре из них.
- example.com
- www.example.com
- dwf.example.com
- chris.example.com
Сервер отлично работает 90% времени, но иногда мы получаем большее количество запросов и сервер базы данных выходит из строя. Это затем приводит к тому, что макс отключает соединения Apache, потому что все соединения БД ожидают тайм-аут. Все хорошо, мы принудительно перезагружаем БД, и соединения восстанавливаются. Однако затем запросы поступают в конфигурацию dfw.example.com. Это развертывание не имеет нашей кодовой базы, что является большой проблемой, и я не понимаю, почему это происходит. Когда это происходит, оно также последовательно относится к этому развертыванию, и никогда ни к одному из других 5, которые мы имеем.
Из документации, которую я прочитал, я подумал, что Apache прочитал файл httpd.conf и искал первое совпадение NamedVirtualHost:
Теперь, когда приходит запрос, сервер сначала проверит, использует ли он IP-адрес, соответствующий NameVirtualHost. Если это так, то он будет смотреть на каждый
<VirtualHost>
раздел с соответствующим IP-адресом и попробуйте найти тот, где ServerName или ServerAlias соответствует запрошенному имени хоста. Если он находит один, то он использует конфигурацию для этого сервера. Если соответствующий виртуальный хост не найден, будет использоваться первый из перечисленных виртуальных хостов, который соответствует IP-адресу.
У нас работает Apache 2.2.15.
Части, которые я считаю важными из файла httpd.conf:
Listen 80
Listen 255.255.255.255:443
...
ServerName www.example.com
... (это точный порядок, www (https/http), dfw, затем все остальные версии)
NameVirtualHost www.example.com:80
<VirtualHost www.example.com:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/www.example.com
ServerName www.example.com
DirectoryIndex index.html
DirectoryIndex index.php
LogLevel notice
ErrorLog /var/log/httpd/www.example.com/error.log
CustomLog /var/log/httpd/www.example.com/access.log w3c_extended
</VirtualHost>
NameVirtualHost www.example.com:443
<VirtualHost www.example.com:443>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/www.example.com
ServerName www.example.com
#certificate stuff
DirectoryIndex index.html
DirectoryIndex index.php
LogLevel notice
ErrorLog /var/log/httpd/www.example.com/error.log
CustomLog /var/log/httpd/www.example.com/access.log w3c_extended
</VirtualHost>
NameVirtualHost dfw.example.com:80
<VirtualHost dfw.example.com:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/dfw.example.com
ServerName dfw.example.com
DirectoryIndex index.html
DirectoryIndex index.php
LogLevel notice
ErrorLog /var/log/httpd/dfw.example.com/error.log
CustomLog /var/log/httpd/dfw.example.com/access.log w3c_extended
</VirtualHost>
NameVirtualHost chris.example.com:443
<VirtualHost chris.example.com:443>
ServerAdmin chris.macdonald@example.com
DocumentRoot /var/www/html/chris.example.com
#cert stuff
ServerName chris.example.com
DirectoryIndex index.html
DirectoryIndex index.php
LogLevel notice
ErrorLog /var/log/httpd/chris.example.com/error.log
CustomLog /var/log/httpd/chris.example.com/access.log w3c_extended
</VirtualHost>
NameVirtualHost chris.example.com:80
<VirtualHost chris.example.com:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/chris.example.com
ServerName chris.example.com
DirectoryIndex index.html
DirectoryIndex index.php
LogLevel notice
RewriteLog /home/chris/writinglog.log
RewriteLogLevel 8
ErrorLog /var/log/httpd/chris.example.com/error.log
CustomLog /var/log/httpd/chris.example.com/access.log w3c_extended
CheckSpelling on
</VirtualHost>
Делать sudo service httpd restart
снова получает правильное обслуживание развертывания.
Выход из apachectl -S
:
VirtualHost configuration:
[IPV6ADDRESS]:443 is a NameVirtualHost
default server chris.example.com (/etc/httpd/conf/httpd.conf:1077)
port 443 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1077)
[IPV6ADDRESS]:80 is a NameVirtualHost
default server chris.example.com (/etc/httpd/conf/httpd.conf:1095)
port 80 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1095)
port 80 namevhost cory.example.com (/etc/httpd/conf/httpd.conf:1128)
IPV4Address:80 is a NameVirtualHost
default server www.example.com (/etc/httpd/conf/httpd.conf:1035)
port 80 namevhost dfw.example.com (/etc/httpd/conf/httpd.conf:1065)
port 80 namevhost www.example.com (/etc/httpd/conf/httpd.conf:1035)
port 80 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1095)
IPV4Address:443 is a NameVirtualHost
default server www.example.com (/etc/httpd/conf/httpd.conf:1047)
port 443 namevhost www.example.com (/etc/httpd/conf/httpd.conf:1047)
port 443 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1077)
wildcard NameVirtualHosts and _default_ servers:
_default_:443 www.example.com (/etc/httpd/conf.d/ssl.conf:74)
Syntax OK
1 ответ
Я не уверен, хорошо ли, что у вас есть несколько NameVirtualHost *
директивы. Насколько я понимаю ваш вопрос, вам нужен только виртуальный хост NAME, и вы хотите, чтобы все интерфейсы на всех портах обрабатывались NameVirtual Host.
Я бы рекомендовал вам создать таких хостов:
# Use Virtual hosts for all interfaces on all ports
NameVirtualHost *
<VirtualHost *>
ServerName example.com
# all other settings for this hostname
</VirtualHost>
<VirtualHost *>
ServerName www.example.com
# all other settings for this hostname
</VirtualHost>
<VirtualHost *>
ServerName dfw.example.com
# all other settings for this hostname
</VirtualHost>
<VirtualHost *>
chris.example.com
# all other settings for this hostname
</VirtualHost>
## ssl.conf
<VirtualHost _default_:443>
ServerName www.example.com
# all other settings for this hostname
SSLEngine on
#certificate stuff
</VirtualHost>
И если вы хотите использовать одинаковые настройки для нескольких имен хостов (например, example.com и www.example.com), вы можете просто добавить директиву ServerAlias, в которой перечислены все имена хостов (подстановочные знаки, такие как "*.example.com", также возможны).
например, виртуальный хост, который соответствует "example.com" и "www.example.com", можно сделать так:
<VirtualHost *>
ServerName example.com
ServerAlias example.com www.example.com
# all other settings for this hostname
</VirtualHost>
Настройки как DirectoryIndex
или же LogLevel
вы можете определить один раз в вашей глобальной конфигурации. Ваш виртуальный хост примет глобальную конфигурацию, и вам не нужно добавлять одинаковое значение для каждого хоста.
Только если одному хосту нужна конфигурация, отличная от глобальных значений, вы должны добавить специальные настройки на этом хосте.