所以,我一直在使用这个指令的cronolog多年:
<VirtualHost *:80> SetEnv origin SND ServerName sandman.net CustomLog "|/usr/bin/cronolog [..]/logs/SND/log_%Y-%m.txt" combined </VirtualHost>
问题是,有很多虚拟主机,当apache产生cronolog时,我突然达到了最大的打开文件描述符。
随着一些谷歌search(在这里search),我找不到解决scheme,所以没有? 正如你所看到的,我在Apache中设置一个ENVvariables为“虚拟主机”,我想要做的是这样的:
CustomLog "|/usr/bin/cronolog [..]/logs/${origin}/log_%Y-%m.txt" combined <VirtualHost *:80> SetEnv origin SND ServerName sandman.net </VirtualHost>
从理论上讲,这只会生成一个写入正确的虚拟主机日志文件的cronolog进程。
但是,在进程的任何阶段,似乎并没有针对Apachevariables分析pipe道命令,这意味着我可以看到的唯一解决scheme是将$ {origin}添加到LogFormat,然后编写我自己的日志循环脚本这将parsing出(并忽略)vhostvariables,然后将剩余的日志行写入相应的文件。 但这会减less开销吗?
还有其他build议吗?
每个打开的日志文件总会有一个cronolog实例。 一个解决scheme是在这里: http : //httpd.apache.org/docs/2.2/logs.html#virtualhost它build议只是添加虚拟主机名称日志文件,然后将其拆分成单独的文件,如果需要的话。
其他可能的解决scheme,你build议:编写你自己的程序/脚本,将日志logging分裂成每个虚拟主机日志。 另外,将所有发送到syslog并在syslog主机上运行拆分程序可能是一个好主意。 通过这种方式,apache将为每个日志types只保留一个文件描述符。 自然会有一些开销,但是apache不会耗尽文件描述符的限制。
也许你可以使用命名pipe道。
一般gelraen的build议是相当不错的,但如果你这样做,你会错过轮换(你可以从syslog调用cronolog,但是可能需要一些额外的队列,以减less开销)
http://httpd.apache.org/docs/2.2/vhosts/fd-limits.html (取自gelraen)
除此之外,也许现在是分配虚拟主机的好时机。 即使你买不起一台真机,你也可以使用一台虚拟机。 但是我不认为把所有东西放在一台服务器上是一个好主意。