Я использую Apache / 2.4.16 на FreeBSD 10.2. У меня работает два экземпляра Apache, каждый из которых обслуживает несколько доменных имен. Сервер имеет два сетевых интерфейса, один для общедоступного Интернета, а другой доступен только через мою внутреннюю локальную сеть. Все файлы конфигурации виртуального хоста почти идентичны, за исключением доменных имен и каталогов. Все сайты работают так, как ожидалось, за исключением одного: если я попытаюсь зайти на Adultemployment.net, я получу страницу сервера по умолчанию, но если я укажу любое из имен компьютеров, настроенных в DNS (www, ftp, mail и т. Д.) .) Я получаю страницу сайта должным образом, например, www.adultemployment.net отображается правильно.
Это файл конфигурации виртуального хоста для vultemployment.net:
<VirtualHost 100.0.193.102:80 192.168.14.202:80>
ServerName AdultEmployment.net
ServerAlias *.AdultEmployment.net
ServerAdmin webmaster@AdultEmployment.net
DocumentRoot "/path.to/adultemploy/www"
<Directory "/path.to/adultemploy/www">
Options All MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorDocument 404 /cgibin/badurl.pl
ErrorLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/error_log 86400"
CustomLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/access_log 86400" combined
<IfModule mod_alias.c>
ScriptAlias /cgibin/ "/path.to/adultemploy/cgibin/"
<Directory "/path.to/adultemploy/cgibin">
AllowOverride None
Options None
Require all granted
</Directory>
</IfModule>
</VirtualHost>
Это файл конфигурации виртуального хоста для другого сайта (который работает правильно), bidsadult.com:
<VirtualHost 100.0.193.102:80 192.168.14.202:80>
ServerName BidsAdult.com
ServerAlias *.BidsAdult.com
ServerAdmin webmaster@BidsAdult.com
DocumentRoot "/path.to/bidsadult/www"
<Directory "/path.to/bidsadult/www">
Options All MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorDocument 404 /cgibin/badurl.pl
ErrorLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/error_log 86400"
CustomLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/access_log 86400" combined
<IfModule mod_alias.c>
ScriptAlias /cgibin/ "/path.to/bidsadult/cgibin/"
<Directory "/path.to/bidsadult/cgibin">
AllowOverride None
Options None
Require all granted
</Directory>
</IfModule>
</VirtualHost>
Конфигурации по умолчанию и виртуального хоста устанавливаются в httpd.conf:
# 'Main' server configuration
#
# The directives in this section provide defaults for any
# <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
ServerAdmin webmaster@occupant591.net
ServerName generic.occupant591
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
<IfModule dir_module>
DirectoryIndex index.php index.cgi index.shtml index.htm index.html
</IfModule>
#
<Files ".ht*">
Require all denied
</Files>
#
LogLevel info
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
<IfModule ssl_module>
LogFormat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" ssl_request
</IfModule>
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
</IfModule>
<IfModule cgid_module>
Scriptsock logs/cgisock
</IfModule>
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-httpd-php .php
AddType application/x-tar .tgz
AddType text/plain .xml
AddType image/x-icon .ico
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
<Location /cgi-bin/phf*>
Deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>
<Location /cgibin/phf*>
Deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>
# 'Main' server configuration
#
# The directives in this file set up the values used by the 'main'
# server, which responds to any requests that aren't handled by any
# other <VirtualHost> definition.
#
Include /path.to.apache.config/conf/generic.site
# Virtual hosts
Include /path.to.apache.config/conf/ActiveSites/*.conf
Конфигурация сайта по умолчанию задается generic.site:
<VirtualHost 100.0.193.102:80 192.168.14.202:80>
ServerAdmin webmaster@occupant591.net
DocumentRoot "/path.to/generic/www"
<Directory "/path.to/generic/www">
Options All MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorDocument 404 /cgibin/badurl-occ.pl
ErrorLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/error_log 86400"
CustomLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/access_log 86400" combined
<IfModule mod_alias.c>
ScriptAlias /cgibin/ "/path.to/generic/cgibin/"
<Directory "/path.to/generic/cgibin">
AllowOverride None
Options None
Require all granted
</Directory>
</IfModule>
</VirtualHost>
Я попытался исправить это, скопировав файл функциональной конфигурации на файл для Adultemployment.net и обновив имя домена и записи каталога. Это ничего не изменило. Я пробовал несколько разных наборов записей ServerName и ServerAlias, например
ServerName www.AdultEmployment.net
ServerAlias *.AdultEmployment.net AdultEmployment.net
и
ServerName www.AdultEmployment.net
ServerAlias *.AdultEmployment.net
Я подумал, что проблема может заключаться в том, что в каталоге ActiveSites по алфавиту первым по алфавиту был домен Adultemployment.net, поэтому я добавил еще один домен перед ним - и этот сайт работает так, как ожидалось, но Adultemployment.net по-прежнему не возвращает свою страницу без имени машины.
Сначала я подумал, что это может быть проблема с кешем браузера, но я получаю такое же поведение при доступе к сайту из Firefox и IE на моей машине w2K, Firefox на моем ноутбуке w7 и lynx ssh'd в оболочке внешней хостинговой компании. Я также попытался очистить запись arp для домена на сервере, но безрезультатно.
Я попытался настроить записи DNS и поискал символические ссылки, как предлагалось Вот или записи .htaccess, как предлагается Вот для подобных проблем, но, похоже, ничего не решает эту проблему, когда один сайт на сервере выходит из строя, но все из остальных работают правильно.
Я пытался решить эту проблему более недели, с перерывами, когда я впервые обнаружил ее, и почти непрерывно в течение последних двух дней. Любые подсказки или указатели будут сильно оценен !!
Я наткнулся на «решение» (на самом деле обходной путь, основная причина все еще неизвестна):
Для этот конфигурации (вторая конфигурация Apache загружается во время загрузки), мне пришлось добавить ServerName
запись, дублирующая информацию из httpd.conf в файл конфигурации generic.site:
ServerName generic.occupant591
После добавления "по умолчанию" ServerName
запись все сайтов, обслуживаемых этот Конфигурация Apache работает правильно. Если аналогичная запись добавлена в Другой конфигурация (первая загружается во время загрузки), сайты, соответствующие "по умолчанию" ServerName
запись не удалась.
TL; DR;
Если посетитель попытался получить доступ к несуществующей странице в ненастроенном домене (т.е. должным образом обслуживается через конфигурацию generic.site), например mature.bid/videos, а [core:info]
в журнал ошибок внесена запись с сообщением File does not exist: /web/generic-occ/www/videos
потому что на общем сайте нет файла или каталога с именем videos
Таким образом, Apache не может ответить на запрос. Хотя записи журнала ошибок указывают на то, что запрашиваются несуществующие страницы, они не содержат домен информация о запросах и поэтому действительно просто шум.
Я использовал стандартный "комбинированный" формат журнала Apache для создания журналов доступа. Опять же, в журналах доступа указаны страницы, к которым осуществляется доступ, но не домен, из которого они были запрошены. Для обычных конфигураций, когда в журналах записывается информация для одного домена, это не проблема, но конфигурация generic.site предназначена для все домены, которые иначе не настроены, поэтому регистрация информации о домене обязательный в данном случае быть полезным. К счастью, Apache предоставляет возможности для регистрации информации о домене и %v
для "каноническое имя сервера, обслуживающего запрос"казалось именно тем, что мне нужно. Я создал новый оператор LogFormat:
LogFormat "%h %l %u %t %v \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined
Я перезапустил Apache, попытался загрузить http://adultemployment.net снова и обнаружил, что журнал доступа содержит запись, включающую AdultEmployment.net "GET / HTTP/1.1"
Отлично, подумал я, это сработало! - пока я не заметил, что тот же текст записывался при доступе к ненастроенному домену. Возможно, мне следует использовать %V
для "имя сервера в соответствии с настройкой UseCanonicalName получить информацию о домене? Я изменил свою команду LogFormat на
LogFormat "%h %l %u %t %V \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined
затем перезапустил Apache - и обнаружил, что домены с несуществующими страницами регистрируются, как я и ожидал. Теперь у меня есть запись о том, к каким ненастроенным сайтам осуществляется доступ, и какие страницы посетители ожидают от них.
Это заставило меня задуматься, почему LogFormat %v
строка записана "AdultEmployment.net" так как "каноническое имя сервера, обслуживающего запрос"- никто конфигурационных файлов написаны таким образом, что AdultEmployment.net должно быть именем сервера по умолчанию. (Для другой конфигурации Apache на этом компьютере %v
регистрируемая строка: "Мечтатель"- имя компьютера O / S для сервера.) Я не могу найти страницу сейчас, но во время моего более раннего исследования я столкнулся с ситуацией, когда аналогичная проблема была исправлена путем изменения имени домена, чтобы оно не совпадало с имя сервера операционной системы. Я попытался использовать ssh для IP-адреса этой конфигурации Apache, чтобы увидеть, отображается ли AdultEmployment.net как часть конфигурации операционной системы, но этого не произошло, как я ожидал.
В качестве эксперимента, который, как я ожидал, вызовет проблемы, я попытался добавить ServerName
запись в файл конфигурации generic.site:
ServerName Dreamer.occupant591.net
Я думал это может исправить Adaltemployment.net (это было), но я ожидал, что он также сломается Occident591.net, вызывая Это для отображения ненастроенной страницы сайта. Однако это было не сломать "хост-сайт" - по сути, сейчас я не смог найти ничего неудачного.
поскольку apache2ctl -S
(как уже упоминалось Вот) недоступен с Apache 2.4 на FreeBSD, я прочитал httpd
справочную страницу и нашел -S
это вариант, который я могу передать непосредственно демону. С ServerName
запись в конфигурации generic.site, httpd -S
отчет начинается с
VirtualHost configuration:
192.168.14.202:80 is a NameVirtualHost
default server Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
port 80 namevhost Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
wild alias *.AAAAAAAAA-Dummy.com
port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
wild alias *.AdultEmployment.net
Когда я удаляю ServerName
запись из конфигурации generic.site, httpd -S
отчет начинается с
VirtualHost configuration:
192.168.14.202:80 is a NameVirtualHost
default server AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
wild alias *.AAAAAAAAA-Dummy.com
port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
wild alias *.AdultEmployment.net
Обратите внимание, что без ServerName
запись, сервер по умолчанию все еще предположительно установлен на generic.site:6
даже если в файле нет записи ServerName, в строке 6 или любой другой строке файла. Ясно что-то сломано но сейчас у меня нет времени гоняться за этим призраком.
Когда я изначально настраивал эту конфигурацию Apache с двумя экземплярами на сервере, у меня был ServerName
запись в конфигурации другого экземпляра, включающая полное доменное имя. Это привело к поломке "основного" сайта, и я исправил который проблема с удалением компонента домена верхнего уровня из ServerName
запись в httpd.conf и удаление ServerName
запись полностью из файла конфигурации generic.site. Я внес те же изменения в эту конфигурацию, которая, похоже, работала примерно до тех пор, пока я не перенастроил свою сеть, чтобы избавиться от маршрутизатора моего интернет-провайдера. В следующий раз, когда я попытался получить доступ Adaltemployment.net, Я нашел проблему, описанную в моем вопросе.
Теперь я озадачен, почему два экземпляра Apache ведут себя по-разному - но мне придется отложить это расследование до тех пор, пока мне нечего будет делать и персонал, с которым это будет делать ...