文章摘要:
在Windows XP SP2下,Winsock的异常将会导致Apache 2.2.8服务无法启动(具体为httpd.exe程序无法启动),其错误日志error.log文件将会有如下提示:
[Sun Jun 01 22:38:02 2008] [crit] (OS 10022)提供了一个无效的参数。
但系统日志不一定会出现该setup_inherited_listeners错误信息,反而可能会出现“httpd.exe: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName
如果系统能记录setup_inherited_listeners错误将会出现如下日志描述:
The Apache service named
>>> (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
解决方法是修复winsock,重置为初始状态即可。如果此方法无效,还要配合在网上邻居->本地连接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉启用LMhosts查询前的勾。
完整标题:
被系统日志和别人的双重误导——记Apache2.2.8异常错误排错手记
关键词:Apache,httpd,系统日志,ErrorLOG,ServerName,setup_inherited_listeners,winsock,VPN
正文:
傍晚刚吃完晚饭,开机,打算通过修改一下别人的论坛源代码来熟悉MySQL的语句,谁知道Apache告诉我,它罢工了,Apache服务无法启动——具体表现为httpd.exe无法启动。
怪了,一直用得好好的,怎么突然就出现这样的错误?赶紧去看系统日志,一排的Apache错误,都无非是这句话:
The Apache service named
>>> httpd.exe: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName
赶紧用这句话作为检索词baidu一下,大多数都说是Apache的Httpd.conf中关于ServerName的设置有问题,但同时大多数都指出,这个并不会使得Apache服务无法启动,本地调试的情况下,可以忽略该信息,以下是官方关于该错误的文档:
http://wiki./httpd/CouldNotDetermineServerName
打开Httpd.conf,发现这个是被用#注释掉的一句。去掉注释并按照本地调试的目的设置为“ServerName 127.0.0.1”后,仍然无法启动。
这时候只好想到覆盖初始设置的方法,因此拿了刚装Apache时候的初始Httpd.conf文件覆盖,无效。(有趣的是,初始httpd.conf文件也是注释掉该行的)
既然覆盖都无效,那么只好卸载再重装Apache了(注意卸载后要手动删除C:\Program Files\Apache Software Foundation\Apache2.2\下的所有配置文件,默认是不删除的),结果安装到最后,一个一闪而过、提示同样的“Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName”错误,Apache还是无法启动。
由于中午没睡觉实在太累、而且也暂时想不到什么方法解决,就只好先睡个觉(即使已经是傍晚),期望一睡过后就会好。结果当然是很傻很天真,Apache服务依然无法启动。正准备重装系统的时候突然想起Apache也有自己的错误记录文件error.log(在安装目录、默认为C:\Program Files\Apache Software Foundation\Apache2.2\下的logs文件夹下),因此决定打开它来看看。
提示:也可通过“开始菜单\程序\Apache HTTP Server 2.2\Review Server Log Files\Review Error Log”来打开该文件。
找到两句:
[Sun Jun 01 22:38:02 2008] [crit] (OS 10022)提供了一个无效的参数。
[Sun Jun 01 22:38:02 2008] [crit] Parent: child process exited with status 3 -- Aborting.
汗......怎么这个错误不会在系统日志上出现?这下被系统日志给彻底误导了。
赶紧用setup_inherited_listeners去google一下,结果绝大部分的解决方法是:
http://home.donews.com/donews/forum/47/2005-11/03/576764.html
1.网上邻居->本地连接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉启用LMhosts查询前的勾.
2.控制面版->windows防火墙->高级标签->本地连接设置->服务的标签里勾选安全Web服务器(HTTPS)即可..
按照上面的提示,我勾掉了“启用LMhosts查询”(因为没用Windows防火墙,所以没做第二步),接着Apache终于能启动了。
高兴之际,隐隐约约不像是这样的问题,因为他们的问题是Apache占用CPU100%才会用这个方法来解决,可是我并不是这样的故障啊。
继续深挖掘,这次变换一个检索词“httpd无法启动”,终于在google找到了一篇“与众不同”的文章。
http://www./happy/thread-125135-1-1.html
这篇文章中,提到了是因为Windows Sockets的异常导致了Apache无法启动。看到这,大汗:枉自己以前对电脑病毒那么熟悉,怎么一个小小的winsock故障就不会想到呢......
赶紧用hijackthis检测一下,果然发现了不明winsock文件的O10。而这些文件,是前两天闲逛校图书馆资源服务的时候、安装的一个VPN服务组件。
原来,图书馆的电子资源因受IP地址的限制,目前只能被校园网内用户访问。要在非校园网内使用校园网的电子资源,则要使用虚拟专用网(简称VPN)技术。而由于这个公司的VPN技术挂接了Winsock,因此就有可能导致Apache无法启动。
金山清理专家的LSP修复工具更能清楚地显示其winsock挂接情况。
(正常的时候)
解决方法是,重置LSP到初始状态(常见的是winsockfix这个软件,金山清理专家的LSP修复工具也能解决该问题)。重启后,问题得到完美解决。
还好,没被大众结果给迷惑,否则只盯着LMhosts的话,估计以后Apache再次出错的时候又兜了个大弯,就是想不到是winsock的问题......
后记:
1、后来我想,能否两个共存呢?于是乎在重启后在Apache正常工作后再次安装该VPN服务插件,发现在再次重启前Apache还能工作,但一旦重启,就不行了;即使通过IE的“管理加载项”来禁止所有与此VPN组件有关的加载项,结果Apache还是无法启动。看来,这两个东西是无法并存的了......
2、第二次测试的时候,系统日志终于有了类似的setup_inherited_listeners错误提示:
The Apache service named
>>> (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
怎么系统日志上有些时候有这个错误、有些时候又没有呢?是软件问题还是系统日志问题?唉,我也不知道......