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

VirtualHost по умолчанию использует неправильное развертывание при перезапуске

У нас есть сервер с семью доменами / поддоменами. Чтобы попытаться сделать здесь как можно меньше, я включу четыре из них.

  1. example.com
  2. www.example.com
  3. dwf.example.com
  4. 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

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

Только если одному хосту нужна конфигурация, отличная от глобальных значений, вы должны добавить специальные настройки на этом хосте.