当使用大量虚拟主机时,如果每个虚拟主机指定不同的日志文件,Apache可能会用完可用的文件描述符(有时称为文件句柄)。对于每个不同的错误日志文件,Apache使用的文件描述符总数为一个,对于每个其他日志文件伪指令,总数为10,供内部使用。Unix操作系统限制了进程可以使用的文件描述符的数量。该限制通常为64,通常可以增加到较大的硬限制。
尽管Apache尝试根据需要增加限制,但在以下情况下可能无法使用:
setrlimit()
系统调用。setrlimit(RLIMIT_NOFILE)
调用在您的系统上不起作用(例如Solaris 2.3)如果出现问题,您可以:
<VirtualHost>
节中指定日志文件,而只记录到主日志文件。(有关执行此操作的更多信息,请参见下面的“ 拆分日志文件”。)
#!/bin/sh
ulimit -S -n 100
exec httpd
如果要将多个虚拟主机记录到同一日志文件中,则可能需要在以后拆分日志文件,以便对各种虚拟主机进行统计分析。这可以通过以下方式实现。
首先,您需要将虚拟主机信息添加到日志条目中。这可以使用
LogFormat
指令和%v
变量来完成。将此添加到日志格式字符串的开头:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost CustomLog logs/multiple_vhost_log vhost
这将以通用日志格式创建一个日志文件,但是在ServerName
每一行之前都添加了规范的虚拟主机(无论指令中出现了什么
)。(有关mod_log_config
更多信息,请参见自定义日志文件。)
当您希望将日志文件拆分为各个组成部分(每个虚拟主机一个文件)时,可以使用该程序split-logfile
来完成此操作。您可以support
在Apache发行版的目录中找到该程序。
使用以下命令运行该程序:
split-logfile < /logs/multiple_vhost_log
使用您的vhost日志文件的名称运行该程序时,它将为出现在日志文件中的每个虚拟主机生成一个文件。每个文件都会被调用hostname.log
。