Apache HTTP Server 版本2.2
當(dāng)使用了大量虛擬主機(jī),而且每個(gè)主機(jī)又使用了不同的日志文件時(shí),Apache可能會(huì)遭遇文件描述符(有時(shí)也稱(chēng)為文件句柄)耗盡的困境。Apache使用的文件描述符總數(shù)如下:每個(gè)不同的錯(cuò)誤日志文件一個(gè)、每個(gè)其他日志文件指令一個(gè)、再加10-20個(gè)作為內(nèi)部使用。Unix操作系統(tǒng)限制了每個(gè)進(jìn)程可以使用的文件描述符數(shù)量。典型上限是64個(gè),但可以進(jìn)行擴(kuò)充,直至到達(dá)一個(gè)很大的硬件限制為止(hard-limit)。
盡管Apache會(huì)試著增大限制,但如果發(fā)生以下情況,則這個(gè)機(jī)制無(wú)法起作用:
setrlimit()
系統(tǒng)調(diào)用。setrlimit(RLIMIT_NOFILE)
調(diào)用無(wú)法在您的系統(tǒng)上正常工作(比如 Solaris 2.3)如果遇到了這樣的問(wèn)題,您可以這樣解決:
<VirtualHost>
配置段中指定日志文件,而是只在主日志文件中進(jìn)行記錄。(參見(jiàn)下述分解日志文件獲得詳情)
#!/bin/sh
ulimit -S -n 100
exec httpd
如果您想把多個(gè)虛擬主機(jī)的日志記錄到同一個(gè)日志文件中,你可能會(huì)想事后把它們分開(kāi),以對(duì)不同的虛擬主機(jī)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析。您可用下述方法達(dá)到這個(gè)目的。
首先,您需要將虛擬主機(jī)的信息放入日志中。您可以用LogFormat
指令和"%v
"變量達(dá)到這個(gè)目的。在您的日志格式串的開(kāi)頭加入它們:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/multiple_vhost_log vhost
這將用日志的普通格式來(lái)創(chuàng)建一個(gè)日志文件。但會(huì)在每條記錄前加上正式的虛擬主機(jī)名(就是在ServerName
指令中定義的那個(gè))。(參見(jiàn)自定義日志格式以獲取更多內(nèi)容)
當(dāng)您想將日志文件分開(kāi)(每個(gè)虛擬主機(jī)一個(gè)日志文件)的時(shí)候,您可以使用split-logfile
程序來(lái)完成這個(gè)工作。您將在Apache發(fā)行版的support
目錄中找到這個(gè)程序。
用如下命令來(lái)運(yùn)行這個(gè)程序:
split-logfile < /logs/multiple_vhost_log
當(dāng)這個(gè)程序在給予一個(gè)虛擬主機(jī)日志文件作為參數(shù)的情況下,會(huì)為日志文件中的每個(gè)虛擬主機(jī)建立一個(gè)文件。每個(gè)文件都以"主機(jī)名.log
"這樣的形式命名。