我在 FreeBSD 10.2 上使用 Apache/2.4.16。我有两个 Apache 实例在运行,每个实例都服务于多个域名。服务器有两个网络接口,一个用于公共 Internet,一个只能通过我的内部 LAN 访问。除了域名和目录之外,所有虚拟主机配置文件几乎相同。所有网站都按预期工作,但有一个除外:如果我尝试访问 adultemployment.net,我会得到服务器的默认页面,但如果我指定 DNS 中配置的任何计算机名称(www、ftp、mail 等),我会按预期获得网站的页面,例如,www.adultemployment.net 显示正确。
这是 adultemployment.net 的虚拟主机配置文件:
<VirtualHost 100.0.193.102:80 192.168.14.202:80>
ServerName AdultEmployment.net
ServerAlias *.AdultEmployment.net
ServerAdmin [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
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
我认为问题可能是因为 adultemployment.net 在 ActiveSites 目录中按字母顺序排在第一位,所以我在它前面添加了另一个域 - 并且该网站按预期运行,但是 adultemployment.net仍然如果没有机器名称则不会返回其页面。
起初我以为这可能是浏览器缓存问题,但我在 w2K 机器上使用 Firefox 和 IE、在 w7 笔记本电脑上使用 Firefox 以及通过 lynx ssh 进入外部托管公司的 shell 时,都遇到了同样的问题。我还尝试清除服务器上域的 arp 条目,但无济于事。
我尝试调整 DNS 条目,并按照建议查找符号链接这里或建议的 .htaccess 条目这里类似的问题,但似乎没有什么可以解决这个问题一服务器上的站点出现故障,但是全部其余的都可以正常工作。
我已经尝试解决这个问题一个多星期了,刚发现这个问题时断断续续,过去两天几乎一直在尝试。任何提示或指示都会大大感谢!!
答案1
我偶然发现了一个“解决方案”(实际上是一种变通方法,其根本原因仍不清楚):
为了这配置(启动时加载的第二个 Apache 配置),我必须将ServerName
httpd.conf 中的信息复制到 generic.site 配置文件中:
ServerName generic.occupant591
添加“默认”后ServerName
条目后,全部所服务的网站这Apache 配置正常工作。如果在其他配置(启动时加载的第一个配置),与“默认”条目匹配的站点ServerName
会失败。
TL;DR;
如果访问者尝试访问未配置域中不存在的页面(即一个适当地通过 generic.site 配置提供服务)例如mature.bid/视频,由于通用站点没有名为的文件或目录,因此[core:info]
在错误日志中写入了一条包含以下消息的条目File does not exist: /web/generic-occ/www/videos
videos
,因此 Apache 无法提供任何内容来响应请求。虽然错误日志条目说明了请求的页面不存在,但它们没有提供任何信息领域有关请求的信息,因此实际上只是噪音。
我使用 Apache 常用的“组合”日志格式来生成访问日志。同样,访问日志指示了被访问的页面,但没有指示请求的域。对于日志记录单个域信息的正常配置,这不是问题,但 generic.site 配置旨在回答全部未配置的域,因此记录域信息是必需的在这种情况下很有用。幸运的是,Apache 提供了记录域信息的选项,并且%v
“处理请求的服务器的规范 ServerName“这似乎正是我所需要的。我创建了一个新的 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
字符串会记录“成人就业网“ 作为 ”处理请求的服务器的规范 ServerName“-没有任何配置文件的编写方式是,AdultEmployment.net 应为默认服务器名称。(对于此计算机上的其他 Apache 配置,%v
记录的字符串是“梦想家“- 服务器的 O/S 机器名称。)我现在找不到该页面,但在我之前的研究中,我遇到了一种情况,通过将域名更改为与操作系统的服务器名称不同,可以解决类似的问题。我尝试通过 ssh 进入此 Apache 配置的 IP 地址,以查看 AdultEmployment.net 是否显示为操作系统配置的一部分 - 但事实并非如此,正如我所料。
作为一个预计会引起问题的实验,我尝试ServerName
在 generic.site 配置文件中添加一个条目:
ServerName Dreamer.occupant591.net
我以为这可能会解决成人就业网(确实如此),但我预计它也会破裂occupant591.net,导致它显示未配置的站点页面。但是,它确实不是破坏“主机”站点 — — 事实上,现在我还没能发现任何失败的地方。
由于apache2ctl -S
(如上所述)这里) 在 FreeBSD 上的 Apache 2.4 中不可用,我阅读了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
在另一个实例的配置中有一个包含完整域名的条目。这导致“主机”站点崩溃,我修复了那问题可以通过从 httpd.conf 中的条目中删除顶级域组件ServerName
以及ServerName
从 generic.site 配置文件中完全删除该条目来解决。我对此配置进行了相同的更改,这似乎有效,直到我重新配置网络以摆脱 ISP 的路由器时才如此。下次我尝试访问成人就业网,我发现了我的问题中描述的问题。
现在我很困惑为什么 Apache 的两个实例表现不同 - 但我不得不推迟这项调查,因为那时我无事可做,也没有员工可以和我一起做……