文件句柄限制 (或者日志文件太多)
当使用大量虚拟主机时,如果每个虚拟主机指定不同的日志文件,则Apache可能会耗尽可用的文件描述符(有时称为文件句柄)。对于每个不同的错误日志文件,Apache使用的文件描述符总数为一个,对于每个其他日志文件伪指令,总数为10,供内部使用。Unix操作系统限制了进程可以使用的文件描述符的数量。该限制通常为64,通常可以增加到较大的硬限制。
尽管Apache尝试根据需要增加限制,但在以下情况下可能无法使用:
- 您的系统不提供
setrlimit()
系统调用。 - 该
setrlimit(RLIMIT_NOFILE)
调用在您的系统上不起作用(例如Solaris 2.3) - 所需的文件描述符数量超过了硬限制。
- 您的系统对文件描述符施加了其他限制,例如仅使用低于256的文件描述符对stdio流进行了限制。(Solaris 2)
如果出现问题,您可以:
- 减少日志文件的数量;不要在各
<VirtualHost>
节中指定日志文件,而仅登录到主日志文件。(有关执行此操作的更多信息,请参见下面的“拆分日志文件”。) - 如果您的系统属于1或2(以上),则在启动Apache之前使用以下脚本增加文件描述符限制:
#!/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
。