Ubuntu 16.04下Apache2.4如何配置日志捕获ServerName或DocumentRoot
当然可以!在Apache 2.4里,你有多种方式追踪请求对应的站点,不管是记录ServerName还是DocumentRoot都很容易,甚至还有更省心的分站点日志方案,我给你逐一说明:
方法1:记录ServerName(最直接推荐)
Apache内置了专门的日志变量%v,它会直接输出当前处理请求的VirtualHost的ServerName值。你只需要把这个变量加到你的日志格式里就行。
比如你可以修改全局的LogFormat(通常在/etc/apache2/apache2.conf或/etc/apache2/mods-available/log_conf.conf中):
LogFormat "%v %{Host}i %U%q" combined_with_servername
然后在每个VirtualHost的配置里引用这个格式:
CustomLog ${APACHE_LOG_DIR}/first_access.log combined_with_servername
如果不想改动全局配置,也可以直接在CustomLog里指定带%v的格式:
CustomLog ${APACHE_LOG_DIR}/first_access.log "%v %{Host}i %U%q"
这样日志里就会清晰显示www.first.com这类ServerName,一眼就能判断请求属于哪个站点。
方法2:记录DocumentRoot
如果想直接记录请求对应的文档根目录,可以用Apache的环境变量DOCUMENT_ROOT,在日志格式里用%{DOCUMENT_ROOT}e来调用它。
配置示例:
LogFormat "%{DOCUMENT_ROOT}e %{Host}i %U%q" combined_with_docroot CustomLog ${APACHE_LOG_DIR}/first_access.log combined_with_docroot
这样日志里就会输出/var/www/first这类路径,明确请求对应的文档根目录。
额外省心方案:给每个站点配置独立日志
其实还有个更简单的思路——直接给每个VirtualHost分配独立的日志文件,这样根本不用解析日志内容,看文件名就知道是哪个站点的请求了:
<VirtualHost *:80> ServerName www.first.com ServerAdmin webmaster@localhost DocumentRoot /var/www/first ErrorLog ${APACHE_LOG_DIR}/first_error.log CustomLog ${APACHE_LOG_DIR}/first_access.log "%{Host}i %U%q" </VirtualHost> <VirtualHost *:80> ServerName www.second.com ServerAdmin webmaster@localhost DocumentRoot /var/www/second ErrorLog ${APACHE_LOG_DIR}/second_error.log CustomLog ${APACHE_LOG_DIR}/second_access.log "%{Host}i %U%q" </VirtualHost>
这种方式维护起来特别方便,排查问题时不用在大日志里筛选,直接对应站点的日志文件就行。
最后别忘了生效配置
修改完所有配置后,重启Apache服务让改动生效:
sudo systemctl restart apache2
(Ubuntu 16.04也可以用旧命令sudo service apache2 restart)
内容的提问来源于stack exchange,提问作者nkg

