现象:用户方打电话,说网站不能正常访问,尝试重启apache后访问正常,但是随后几分钟又无法访问,需要不断重启才能维持官网访问,到现场查看后,发现错误日志error.log中记载了大量的虚拟主机日志切割不正常的报错,报错内容为:piped log program 'bin/rotatelogs.exe D:/Apache2.2/logs/access_****.cn_%y%m%d.log 86400 480' failed unexpectedly. ***为对应的子站域名,http-vhosts.conf中配置了大概近五十个子站(虚拟主机),而报错日志中***将所有的子站都给囊括其中了。
处理方式:
1)、以为日志无法切割,遂观察了下access.log和error.log以及对应的子站的日志,发现有对应日期的切割记录;
2)、停止apache,将logs下所有日志剪切到别的目录,重新启动apache,观察到access.log和error.log正常生成,访问网站,无法响应,且error.log再不断的增大,打开发现内容还是为以上报错;
3)、网上有说这种报错是因为rotatelogs.exe的路径为相对路径引起的,但是我这里确不是这个问题,因为之前确实能生成对应日期的日志;
4)、尝试将虚拟主机配置文件中只配置一个虚拟主机(也就是只配一个网站信息,将所有子站暂时屏蔽掉),尝试重启apache,发现报错消失,当时猛的一惊,以为apache对虚拟主机数有限制?没听过这个事啊,别的项目上配置五六十个子站的也没见有事啊,既然怀疑,那就先尝试下,五个左右的加入配置的虚拟主机,当虚拟主机数到达25个的时候,此错误又开始出现;
5)、这时候灵光一闪,突然意识到,走错方向了,不是虚拟主机的数量限制,应该是文件描述符不够了(windows上叫文件句柄数),然后尝试将所有子站的访问日志和错误日志配置都给注掉,然后将所有虚拟主机都给加回去,大概四十六七个的样子,然后重启apache,发现日志并没有持续增长,也没有再报这个错误。
因为刚好客户那边web服务器空间不是很重足了,沟通后决定也就暂时不再启用对应的子站的日志记录了,只保留主站的日志记录。事后回想才