Неправильное развертывание 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-адрес Имя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
5
задан 7 June 2016 в 04:03
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>

p.s. Такие настройки, как DirectoryIndex или LogLevel , вы можете определить один раз в своей глобальной конфигурации.Ваш виртуальный хост примет глобальную конфигурацию, и вам не нужно добавлять одно и то же значение для каждого хоста.

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

1
ответ дан 3 December 2019 в 02:02

Теги

Похожие вопросы