9月 262008
 

我在一个行业应用软件中,因为业务需求(监控页面)使用ajax定时刷新技术,由于该页面长期运行,导致内存暴增,3天apache.exe,就占用近2G,通过google和百度的搜索,发现影响apache内存性能的主要有一下几个参数:

ThreadsPerChild
MaxRequestsPerChild
————-
KeepAlive
MaxKeepAliveRequests
KeepAliveTimeout

参数简单介绍如下: Continue reading »

9月 252008
 

Leftleg's Blog 2007年09月26日

  在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

  KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭TCP 连接,可以提高用户访问速度。

  那么我们考虑3种情况:
  1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
  2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript 文件,一个图片文件。
  3。用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

  对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive

  下面我来分析一下原因。

  在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?

  先看看理论分析。 Continue reading »

9月 112008
 

菜雨博客

今天买伞回来之后发现我放blog的虚拟机又出问题了,windows2003显示虚拟内存不足。于是我登录进去看,其他同样设置的机器原来都是一直好好的,为什么就是这个不行,而且这样的情况出现的不止一次了。重启,进入系统,非常慢,打开任务管理器,发现Apache的进程httpd.exe的内存占用竟然到了400多M,而且还在不停增加,难怪了。重启之后,现象一样,httpd.exe占用的内存不断增加,直到把机器拖垮。

上网搜索,很多的还是说是因为配置的原因,说是要将 httpd.conf 中的 Threadsperchild 和MaxRequestsPerchild做合适的配置。ThreadsPerChild的意思是系统启动时默认启动的等待线程数,用来等待处理客户的请求,MaxRequestsPerchild 指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。根据很多人的经验,一般的服务器2G内存或4G内存,ThreadsPerChild 200~300,MaxRequestsPerchild 1000~3000。我用的是虚拟机,只划了512M内存过去,我不停的修改参数设置,大致知道了占用的最大内存会是Threadsperchild的3-4倍。我最后给自己的虚拟机的设置是Threadsperchild 50 ,MaxRequestsPerchild 256 。暂时还是有用的,但是长久我就不知道了,我看到很多人还是没有用的,又有说法是这个是Apache 2.2.4及其之下的一个bug。很不幸,我用的是APMSERV的集成包,Apache是2.2.3。我刚刚在发布上篇日志的时候就看到了内存又飙到了200多M。我的直觉告诉我服务器的这个问题肯定和wordpress有关,或者是它的一个插件或者主题引起的,另外一个CMS是DEDE,基本都静态页,应该没什么问题的。但是我现在很崩溃,这么细致的试还真没有时间。 Continue reading »

9月 092008
 

access.log,件在 WEB 服务器运行一段时间之后会达到几十兆甚至上百兆,如果Apache运行有错误,error.log也会增大到几十兆,我们知道系统读写一个大的文本文件是非常耗内存的,因此限定日志文件大小十分必要。

通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/docs/2.0/programs/rotatelogs.html,可以用apache 自己的程序 rotatelogs.exe(位于 {$apache}/bin/目录下),来限制日志文件的大小。

Usage: rotatelogs [-l] [offset minutes from UTC] or

Add this:
TransferLog “|rotatelogs /some/where 86400”  
or
TransferLog “|rotatelogs /some/where 5M”
to httpd.conf. The generated name will be /some/where.nnnn where nnnn is the system time at which the log nominally starts (N.B. if using a rotation time, the time will always be a multiple of the rotation time, so you can synchronizecron scripts with it). At the end of each rotation time or when the file size is reached a new log is started.

在 Windows 下的设置例子如下: Continue reading »

9月 082008
 

作者: Jet Mah from Java堂

所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。

下面我们针对几种错误信息进行分析并给出解决的方法:

1. Apache与WinSock v2相冲突
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。

其错误提示如下所示:

    [error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

    [error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

    [warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptEx failed.

    [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

可以依次采用下面的方法来解决上面的问题,如果进行了一步还有问题就继续下一步:

1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API : Continue reading »

9月 082008
 

一般来说,WinNT系统下使用IIS,而Apache在Linux下应用的比较多,但是依然有很多人在WinNT系统下使用Apache而非IIS,可能是基于对Windows系统的熟悉吧。今天就来说一下在Windows系统下如果优化Apache的性能。

mpm_winnt.c是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程轮流产生多个线程来处理请求。也就是说mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。

mpm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。

ThreadsPerChild
这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。

mpm_winnt上的默认值是64, 最大值是1920. 这里建议设置为100-500之间,服务器性能高的话值大一些,反之值小一些。

MaxRequestsPerChild
该参数表示每个子进程能够处理的最大请求数, 即同时间内子进程数目.设置为零表示不限制, mpm_winnt上的默认值就是0.

方参考手册中不建议设置为0, 主要基于两点考虑: (1) 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 Continue reading »

7月 172008
 

6.3.2  隐藏和伪装Apache的版本
通常,软件的漏洞信息和特定版本是相关的,因此,版本号对黑客来说是最有价值的。
默认情况下,系统会把Apache版本模块都显示出来(http返回头)。如果列举目录的话,会显示域名信息(文件列表正文),去除Apache版本号的方法是修改配置文件/etc/httpd.conf。找到关键字ServerSignature,将其设定为:

ServerSignature Off
ServerTokens Prod    

然后重新启动Apache服务器。
通过分析Web服务器的类型,大致可以推测出操作系统的类型,比如,Windows使用IIS来提供HTTP服务,而Linux中最常见的是Apache。
默认的Apache配置里没有任何信息保护机制,并且允许目录浏览。通过目录浏览,通常可以获得类似“Apache/1.3.27 Server at apache.linuxforum.net Port 80”或“Apache/2.0.49 (Unix) PHP/4.3.8”的信息。 Continue reading »

6月 262008
 

发愁,发愁,除了发愁还是发愁!404错误页究竟该如何做?

一般朋友们买了虚拟主机放网站上去,一段时间后,由于网站改版或者是删除某些网页,这直接导致以前曾被搜索引擎收录的网页连接失效。所以我们可以使用404的自定义错误页,自己给这个404页子里放个什么指向首页的连接什么的。当错误页失效连接多了之后,这个做法非常的危险:

1、如果给404错误页里放些指向首页的连接吧?404叶子多了之后,搜索引擎尤其是GOOGLE会认为你在复制网页

2、如果直接将404错误页做个什么转向到首页吧?那不是找死?!!用不了几天就被K出局外了。

可是不做个404错误页吧?好不容易进来的访客你给人家说无法找到该网页,就好比咱去访问个亲戚朋友,去了结果他不在了,你这个朋友还算朋友吗?还感信任你吗?同理你站还有信任度吗?也同理,当错误页多了之后,搜索引擎数据库定期更新他的已收录的URL连接,怎么每次都是“404找不到文件,错误已返回的提示” ,搜索引擎都不信任你了。

以下是网友们说的:

自定义404错误页使用Meta Refresh返回“302”状态码 Continue reading »