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

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

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

Другие вопросы по тегам