У нас есть сервер с семью доменами / поддоменами. Чтобы попытаться сделать здесь как можно меньше, я включу четыре из них.
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
Я не уверен, хорошо ли, что у вас есть несколько 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>
p.s. Настройки вроде DirectoryIndex
или LogLevel
вы можете определить один раз в своей глобальной конфигурации. Ваш виртуальный хост примет глобальную конфигурацию, и вам не нужно добавлять одно и то же значение для каждого хоста.
Только если одному хосту нужна конфигурация, отличная от глобальных значений, вы должны добавить специальные настройки на этом хосте.