问一个apache端口filtered的老问题

发表于:2007-05-25来源:作者:点击数: 标签:
我有一台服务器,运行着apache,用户访问量非常大,大概高峰时期,同时在线2000人左右.偶尔会出现如下情况(用nmap扫描结果): 80/tcpfilteredhttp 这样,网站就无法访问了.不得不重启apache才能恢复正常. 出现这种情况时,有时内存使用较高,会启用较多的swap,500M左

我有一台服务器,运行着apache,用户访问量非常大,大概高峰时期,同时在线2000人左右.偶尔会出现如下情况(用nmap扫描结果):
80/tcp filtered http
这样,网站就无法访问了.不得不重启apache才能恢复正常.
出现这种情况时,有时内存使用较高,会启用较多的swap,500M左右.我的物理内存为1G.有时好象apache进程非常多,可能有10多个,一般正常情况下,大概8个左右.我的Apache是以mpn=worker来编译的.
请高手指点,这可能是什么原因,如何防范这种情况的发生.谢谢!

 peng 回复于:2004-10-22 09:12:05
问题描述的太笼统了。。

你的web是什么样子的?静态页面还是php  or jsp?
还有,不能访问的时候,apache日值报什么错误?
系统性能检测的时候,是什么伏在状况啊?

还有,你的apache具体的worker模块的设置参数是什么啊。。
分析一个问题,要多方面的排除啊。。
很少有问题一下就能知道的。。

 yesright 回复于:2004-10-22 11:55:25
我的服务器有一个行业咨讯网站,apache2+php4+mysql4
分前台和后台,前台全部是HTML页面,后台是php网站生成系统.
根据不同的页面,更新为每3秒到几分钟不等.
服务器配置为:dell2650/2cpu 2.8G/1G mem
同时在线人数一般为500--2000人不等.流量为3--8M
apache日志已经作了日志滚动,每天生成一个日志,大概1.5G左右.
下面附有一张mrtg图,有标示当时的情况.大概在10月21号23:30左右出现故障.
[url]http://www.yesright.com/mrtg.mht[/url]

 peng 回复于:2004-10-22 12:05:04
嗯,这么说是用新闻编辑器来生成的。
你的后台是apache2+mysql+php4,前台也是放在这个机器上吧。

也就是说,通过虚拟主机来实现不同域名的访问,来区分前后台的。

如果是静态页面,apache2估计1g的内存是不能支持2000条http的同时访问的。负载比较严重。
还有,你把你的httpd.conf文件关于mpm=worker的那个参数帖出来,我要看看你的参数连接设置是什么,发生这种filter是由于软限制还是硬限制产生的。。

 yesright 回复于:2004-10-25 14:41:21
谢谢peng,没错,我的html和发布系统在同一台服务器上,现在正准备做负载平衡.
我的httpd.conf中worker.c的配置如下:
$ cat /usr/local/apache2/conf/httpd.conf |grep worker.c -A 10
<IfModule worker.c>
StartServers         2
MaxClients         3000
ServerLimit        60
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     50
MaxRequestsPerChild  0
</IfModule>

服务器cpu一般负载在70%到95%
我的服务器在高峰期已经达到了apache的MaxClients 3000,从www.yesright.com/onlinehttpd.png可以看到,已经一条直线了.
在最高峰期(在线httpd统计3000时),交换分区会用到1000M左右.
请问我的worker.c能不能加大MaxClients,我有点怕服务器忙不过来,而造成apache死掉.

下面附有一张昨天的内存使用图和在线人数的mrtg图
www.yesright.com/mem.png
www.yesright.com/onlinehttpd.png

 peng 回复于:2004-10-25 15:21:51
你的物理内存是有点小,可以这样试试。

增大线程,缩小进程看看。。

<IfModule worker.c>
StartServers        4
ServerLimit         128
ThreadLimit         256
MaxClients         4096
MinSpareThreads     64
MaxSpareThreads     128
ThreadsPerChild     64
MaxRequestsPerChild  0
</IfModule>

在web的大访问量期间,要有人守候,因为是生产机,最好监测一下。
如果条件允许,最好能扩大物理内存,不能让内存使用到100%。还有,swap分区最好是物理内存的3-4倍,防止程序编写的错误。

分析一下日志,看看高峰期的时候,apache的连接ip都是那些,统计一下,有没有攻击或者不正常的情况,如果多数是从几个固定ip连接过来的,就要分析一下了。。

 yesright 回复于:2004-10-25 16:42:13
谢谢你的建议,我会在接下来的一周进行测试.

 yesright 回复于:2004-10-25 17:06:39
我想借此机会,请教一下负载均衡的问题(假定以后发展到同时10000人在线).
我的负载均衡仅仅只要求apache的html页面的负载均衡,因为我服务器的瓶颈在内存上和IO上.

我的初步设想如下:
一台后台服务器,专门做html的生成
用两台服务器作前台,提供html访问
负载均衡采用DNS轮询
html发布采用nfs.(例如:把两台前台的网站主目录mount到后台服务器上,发布时同时复制两份到前台)

这只是小弟的初步设想,请大家多多指教.

 peng 回复于:2004-10-25 17:37:28
如果想同时支持10000人的话,在普通的pc server上,做负载均衡是必须的了。

我看到你的方案,如果在10000人以上,面临的三个问题:http的大请求量、硬盘的io负载,还有就是内存了。。

对于你的解决方案,如果用nfs的话,是解决不了io的问题。
其实你可以这样:apache+squid的。。


1、1台apache的主机,做新闻发稿器来生成主页。同时,这个机器提供远程的nfs的磁盘存贮。
2、前端2台主机做发布主机,一台安装apache+squid,另一台只安装squid。

原理:发布的主机接受到用户的访问请求,是要访问后台的新闻发稿器的磁盘,这样,每增加一个前端的机器,就是增加一份对io的请求。io的请求是不会降低,而是增高的。所以,同squid做反相代理,来相应用户的http的请求。访问后,会在本机的squid的cache中存放数据。当用户再访问这个数据时候,squid是读取本机上的cache,而不是远程nfs连接的数据,从而大大的降低了硬盘的io读写。把io负载充分的分散到前端的两个主机本身的硬盘上了。而且,你你发布的是新闻,新闻更新的速度不是很快的,就是说,用户既大多数都在访问squid的cache,从而更能体现出squid的好处了。

第一主机用apache+squid,其中的apache是起到读取后台的硬盘的作用。前端的squid通过80端口来相应用户请求。另一台机器也是squid的80端口相应用户,对于新的请求,连接第一台机器,让第一个机器的apache来访问后台主机的数据硬盘。

软件构建就是这样的:

新闻发稿器(apache+nfs server)--apache主机(第一太主机)--squid(两个对外相应的机器)。

如果你前端用三台机器,是最好的选择。两个主机装squid,一个主机就安装apache。通过dns论许,http请求均匀的发送到三个主机上。统计那个apache主机,乘以3,就是所有的网站pv了。。这里主意一点,就是squid好像软件请求的极限是3000个httpd相应。

之所以用1个apache +2个squid,是因为squid没有办法做访问统计。

还有,这种结构,随着你的应用增加,只需要增加你的squid机器就可以了。当前端的apache负担增大的时候,可以在squid主机上在安装apache来均分squid请求就ok了。。

大多数的门户网站都是用了这种apache+squid的配置结构。当然了,很多有钱的公司,直接就买了cache服务器,例如.netapp公司的netcache就是专门干这个的,替代了主机装squid来做cache。

 yesright 回复于:2004-10-25 23:47:42
谢谢你详细的建议,做squid代理可能不能适合我的要求
因为我的服务器不是真正的新闻服务器,是一种类行业咨讯提供系统.
就象pconline.com.cn,同步各地区行情,或是足球的赔率网站,实时同步全球顶级联赛数据,系统时刻在更新,我的首页每三秒会更新一次,有些几分钟更新,是通过调用一个xml(或者说是一个数组),实时性太强了.可能代理方案是行不通的.

 peng 回复于:2004-10-26 09:31:47
如果是这样的话,就要根据实际情况测试一下了。最好后台的服务器买个sun sparc的。。当然了,如果有条件,建议添加一个小的阵列,这样来做nfs的存储空间,能很好的解决磁盘io问题。。

原文转自:http://www.ltesting.net