🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 文件描述符限制 当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为&lt;cite class="calibre27"&gt;文件句柄&lt;/cite&gt;)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管Apache会试着增大限制,但如果发生以下情况,则这个机制无法起作用: 1. 您的操作系统没有提供`setrlimit()`系统调用。 2. `setrlimit(RLIMIT_NOFILE)`调用无法在您的系统上正常工作(比如 Solaris 2.3) 3. 文件描述符的需求量已经超出了硬件的限制。 4. 您的操作系统对文件描述符作出了其他限制。比如说限制了stdio流只能使用256以下的文件描述符。(Solaris 2) 如果遇到了这样的问题,您可以这样解决: * 减少日志文件的数量。不在`<VirtualHost>`配置段中指定日志文件,而是只在主日志文件中进行记录。(参见下述[分解日志文件](#calibre_link-69)获得详情) * 如果您的系统因上述第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`指令中定义的那个)。(参见[自定义日志格式](#calibre_link-72)以获取更多内容) 当您想将日志文件分开(每个虚拟主机一个日志文件)的时候,您可以使用`split-logfile`程序来完成这个工作。您将在Apache发行版的`support`目录中找到这个程序。 用如下命令来运行这个程序: ``` split-logfile < /logs/multiple_vhost_log ``` 当这个程序在给予一个虚拟主机日志文件作为参数的情况下,会为日志文件中的每个虚拟主机建立一个文件。每个文件都以"`主机名.log`"这样的形式命名。