文件 Descriptors 限制

当使用大量虚拟主机时,如果每个虚拟主机指定不同的日志文件,则 Apache 可能会耗尽可用的文件 Descriptors(有时称为文件句柄)。对于每个不同的错误日志文件,Apache 使用的文件 Descriptors 总数为一个,对于每个其他日志文件伪指令,总数为 10,供内部使用。 Unix os 限制了进程可以使用的文件 Descriptors 的数量。该限制通常为 64,通常可以增加到较大的硬限制。

尽管 Apache 尝试根据需要增加限制,但在以下情况下可能无法使用:

  • 您的系统不提供setrlimit()系统调用。

  • setrlimit(RLIMIT_NOFILE)调用在您的系统上不起作用(例如 Solaris 2.3)

  • 所需的文件 Descriptors 数量超过了硬限制。

  • 您的系统对文件 Descriptors 施加了其他限制,例如仅使用低于 256 的文件 Descriptors 对 stdio 流进行了限制。(Solaris 2)

如果出现问题,您可以:

  • 减少日志文件的数量;不要在<VirtualHost>部分中指定日志文件,而只能登录到主日志文件。 (有关执行此操作的更多信息,请参见下面的拆分日志文件。)

  • 如果您的系统属于 1 或 2(以上),则在启动 Apache 之前使用以下脚本来增加文件 Descriptors 限制:

#!/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完成此操作。您可以在 Apache 发行版的support目录中找到该程序。

使用以下命令运行该程序:

split-logfile < /logs/multiple_vhost_log

使用您的 vhost 日志文件的名称运行该程序时,它将为出现在日志文件中的每个虚拟主机生成一个文件。每个文件将称为hostname.log