最近两天被服务器上的apache搞得比较郁闷,每次开启apache之后其后台进程httpd.exe总是占用100%,而且服务器本身能够远程桌面连接(说明网络连接正常),但是却无法上Internet网(可以使用IP上网,不能使用域名,即DNS出现问题),联系了服务器托管商的IDC也没能帮我们解决,只好自己动手,丰衣足食了。
开始以为是端口问题,在apache打开时,在cmd下使用netstat -ano命令查看80是否被其他程序占用,但是根据PID显示在(如下:1364)的却是httpd.exe这个apache的后台线程占用着80端口。在将apache关闭之后再使用socket tool这个工具来测试80端口,这时80端口仍然可用。充分说明不是端口的问题,同时该端口也并未受到攻击。
在网上也没有能够直接找到比较好的解决方法,后来在一个帖子上看到说,有可能是apache与其他的软件冲突了(参考http://topic.csdn.net/u/20080331/14/9a86ed60-285e-49b9-a11c-f42810dc64a5.html的35楼)。如果是冲突,他会一直写在apache/logs/ 目录下的 error.log 错误日志。结果结果我看到我的error.log文件已经达到将近700M的大小,而且在开着apache的时候还在不断增大。看到里面的错误是“(OS 10038)在一个非套接字上尝试了一个操作。 : Child 8164: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.”最后终于在网上找到了相应的解决方法(参考http://www.cnblogs.com/mr-jhao/articles/2240699.html)
(1)编辑httpd.conf
Win32DisableAcceptEx ##加入这行 ThreadsPerChild 250 MaxRequestsPerChild 0
重启apache就解决了。
修改后还是不行,任然有错误记录,CPU占用率是降低了,但是还是没有恢复到原来的状态.logs里面还是一直在记录下面的错误报告。
(2)在win命令行cmd下,输入以下命令
netsh winsock reset
原因与winsock有关,这里主要是因为金山毒霸或者升级精灵修改了WINSOCK导致的。由于我电脑上也安装了金山毒霸,而且最近几天也升级过了,应该是同样的问题。
使用此条命令恢复后,重启电脑,这下Apache恢复当原先的良好状态了。
-----------------------------------------------分割线---------------------------------------------------------
对于上面加入httpd.conf中内容的解释参考http://topic.csdn.net/u/20080331/14/9a86ed60-285e-49b9-a11c-f42810dc64a5.html的5楼的回答
通常在“Windows任务管理器-进程”中可以看到两个httpd.exe进程,一个是父进程、一个是子进程,父进程接到访问请求后,将请求交由子进程处理。 MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。在处理“MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。 如果MaxRequestsPerChild缺省设为0(无限)或较大的数字(例如10000以上)可以使每个子进程处理更多的请求,不会因为不断终止、启动子进程降低访问效率,但MaxRequestsPerChild设置为0时,如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出。