Apache 2(Debian Stretch)虚拟主机日志归属异常是否为配置错误?
这确实属于虚拟主机配置的常见问题,核心原因是Apache的「默认主机」机制在起作用,下面给你详细拆解:
为什么会出现这种情况?
Apache会把没有匹配到对应ServerName/ServerAlias的请求,自动路由到配置文件中第一个被加载的虚拟主机(也就是默认主机)。你的场景里,bo.example.com是第一个加载的虚拟主机,所以所有无法匹配到example.com的请求,都会被归类到它的日志里。
从你提供的日志示例来看:
bo.example.com:80 xx.xxx.xxx.xxx - - [23/May/2018:14:59:26 +0200] "\x16\x03\x01" 400 0 "-" "-"
这个请求是TLS握手数据(\x16\x03\x01是SSL/TLS的握手起始标识)却发到了80端口(HTTP),Apache返回400错误,这类请求通常没有携带正确的Host头,自然会被默认主机处理。
排查与修复步骤
检查虚拟主机的
ServerName/ServerAlias配置
打开两个虚拟主机的配置文件(通常在/etc/apache2/sites-available/目录下),确认:bo.example.com的配置里有明确的ServerName bo.example.comexample.com的配置里必须包含ServerName example.com,如果需要支持www子域名,还要加上ServerAlias www.example.com
确认配置文件的加载顺序
Debian系统中,Apache会按配置文件名的字母顺序加载虚拟主机配置。如果bo.example.com的配置文件名(比如000-bo.example.com.conf)比example.com的(比如001-example.com.conf)更靠前,它就会成为默认主机。
如果你想让example.com作为默认主机,可以修改它的文件名,让字母顺序提前(比如改成000-example.com.conf),然后重启Apache生效:sudo systemctl restart apache2处理无效请求(可选)
对于这类发错端口的TLS请求,你可以配置一个专门的「默认虚拟主机」来处理,避免污染正常站点的日志。比如创建一个只返回400错误的默认主机,把它的文件名设为最靠前的(比如000-default.conf),这样所有无法匹配的请求都会被导向这里。
内容的提问来源于stack exchange,提问作者C. Nü

