免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 15753 | 回复: 32
打印 上一主题 下一主题

[Web] apache使用的一些心得 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-25 11:09 |只看该作者 |倒序浏览
web服务器用了一段时间,总结了以下一些经验供大家参考


一、够用就好
可以理解为web服务器是一条高速公路,如果出现让每一条车道都足够宽,那么消耗了很多的路面资源,能跑的车就少了。同样web服务器也是这样,不是所有的配置调整的越大越好,一般php+mysql+apache的架构,因为老碰到mysql连接数满的问题,所以把mysql连接数设置的非常高,同时加大mysql cache结果导致负载很高的时候,内存被大量消耗导致服务器频繁死机。
后来检查了下程序,发现mysql连接数过高是由于程序编写不合理造成了,调整了下,服务器连接数就下来了:很多人可能跟我一样写php数据库查询完以后没有立即关闭数据库的习惯,让进程终止后系统自动回收打开的数据连接,但是如果系统非常慢的时候,执行一个php需要花费非常长是时间,那么导致mysql数据库一直保持着,导致连接数非常高,这样数据库消耗大量的内存,导致系统频繁使用swap,导致系统更加慢,然后恶性循环,最终服务器发生菪机。一个原则:在需要数据库的时候才打开数据库连接,一旦数据读取完成,立即关闭数据库。另外mysql cache的大小也不应该设置太大,应该经常使用show status命令察看下mysql的情况,按照实际需求配置mysql相关的chache 和最大连接数。
检测Mysql的性能可以通过 select benchmark(100000,sql语句) 来检查mysql运行100000那个sql语句需要的时间。
你可以可以通过 SELECT * FROM 表名 PROCEDURE ANALYSE ( )  来分析各个子段类型大小是否设置合适


二、研究是web的限制和系统本身的限制
linux 内核对打开的文件数一些有限制,一般可以通过ulimit -a 察看,/proc目录下有一些相关的最大值的控制,当服务器出现菪机的时候,一定要分析一下/var/log/message目录下的文件,机器菪机前系统报了什么错误。如果机器还能操作你可以使用命令dmesg看看内核当时出现了那些错误

如果是内核的限制看下 http://shika.aist-nara.ac.jp/member/atsush-m/doc/kernel_tune.html 重新编译下内核,看这篇文章的时候注意一点这份文档居然没让你改大include/linux/fs.h NR_FILE,需要将NR_FILE设置成INR_OPEN的三倍大小,千万不要小于INR_OPEN,光光打开apache的HARD_SERVER_LIMIT 是不够的。
检测打开的文件数是否够用可以运行下 more /proc/sys/fs/file-nr ,第一个值是系统已经分配的句柄数(你可以理解为系统打开最大的句柄数),第二个值是系统当前使用句柄数,第三个值是系统允许打开得句柄数,如果第一个值等于第三个值你需要考虑是否需要增加系统打开的句柄数,一方面你可以echo 一个比较大的值到 /proc/sys/fs/file-max,但是内核编译的时候决定了系统最大的文件数,这个值超过内核编译时候设置的内核数就需要重新编译内核来支持。

如果机器有一定的内存,可以把bdflush的值设大,类似这样
echo "100 128 128 512 5000 3000 60 0 0">;/proc/sys/vm/bdflush
希望长期有效的话可以配放在rc.local下
这个值具体什么意思可以运行 update -d 看下具体的解释

另外如果你怀疑有Dos攻击的话,可以运行
netstat -an | grep -i "服务器ip地址:80" | awk '{print $6}' | sort | uniq -c | sort -n

这个命令会自动统计Tcp连接各个状态的数量,如果SYN_RECV很高的话(我的机器出现过给人建立了4000个SYN_RECV的事情。。。),就不能排除有基于tcp协议的ddos攻击的可能
这样的话,你需要打开tcp_syncookies
echo 1 >; /proc/sys/net/ipv4/tcp_syncookies
如果没有 /proc/sys/net/ipv4/tcp_syncookies说明你的内核不支持syncookies,需要重新编译内核
同时
降低syn重试次数
echo "1" >; /proc/sys/net/ipv4/tcp_syn_retries
echo "1" >; /proc/sys/net/ipv4/tcp_synack_retries
加大syn_backlog,以保证用户的访问(消耗内存为代价,设的太高。。)
echo "2048" >; /proc/sys/net/ipv4/tcp_max_syn_backlog
如果还是不行,那么只能交给相应的硬件防火墙了


如果机器是用来做虚拟主机的话,如果有很多行
<VirtualHost>;
。。。。。。
</VirtualHost>;
这样的东东的话(我看见过一个人配了1000个不同的域名在一个机器里面,佩服他的耐心)可以考虑使用mod_rewrite方式来做,可以通过增加一个rewrite规则到apache里面,实现域名对应自动对应某个目录

三、不要太迷信一些第三方的加速软件
相信很多人在服务器负载较高的时候使用mod_limitipconn,mmcache等做服务器的加速,但是mod_limitipconn需要打开ExtendedStatus,反而会导致服务器性能下降,同样由于自身程序写得不够规范也可能导致mmcache这样的php加速软件使用的时候发生一些问题。
如果条件许可,尽量建立cms系统让动态的叶面以静态的叶面显示


以下是一个web服务系统检测的程序,5秒检查一次服务器负载,如果loadavg超过50系统自动重起apache


#!/usr/bin/perl
#pid文件
$pidfile="/www/apache/logs/httpd.pid";
#apache操作文件
$apachectl="/www/apache/bin/apachectl";

$ApacheIsRun=1;
while (true) {
$nowLoadavg=CheckLoadavg();
print "Now:$nowLoadavg\n";
if ($nowLoadavg >;50 && $ApacheIsRun==1) {
#负载高于50
print "The Server have problem\nStop Webserver\n";
while (CheckApacheRun()==0) {
system("$apachectl stop");
sleep(20);
}
$ApacheIsRun=0;
}
if ($ApacheIsRun==0 || CheckApacheRun()==-1) {
print "Start Webserver\n";
system("$apachectl start");
$ApacheIsRun=1;
sleep(360);
}

sleep(5);
}

sub CheckApacheRun {
my $PID="";
my $Status="";
#是否存在pid 不存在返回-1
if (-e $pidfile) {
$PID=`cat $pidfile`;
$PID=~s/\n//g;
if ($PID eq "") { #pid文件为空
return -1;
} else {
$Status=`ps -ef|grep httpd|wc -l`;
if ($Status < 3) {return -1;} else {return 0;}
}
} else {
#pid文件不存在
return -1;
}
}


sub CheckLoadavg {
my @avg=split(/\ /,`cat /proc/loadavg`);
return $avg[0];
}


我msn:dowell2004@hotmail.com,欢迎大家跟我这个三脚猫通过msn交流linux,apache学习心得

[ 本帖最后由 dowell3000 于 2006-10-8 17:47 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2005-01-25 12:10 |只看该作者

apache使用的一些心得

很好,不过可不可以解释一下子:
如果uptime超过50系统自动重起服务器


我在努力让我的,uptime超过1000天的啊

论坛徽章:
0
3 [报告]
发表于 2005-01-25 12:33 |只看该作者

apache使用的一些心得

这里说的uptime不是服务器运行时间,可能说uptime不是很合适,你在linux 输入命令uptime,系统会提示系统的德当前的负载情况,他显示服务器是否是繁忙,一般uptime是1以下的话,说明服务器非常正常,如果出现大量的iowait或者同时大量的http情况,他再输入uptime看下,可能100或者可能500以上。

一般服务器到50就开始明显缓慢,可能是web服务器程序设计不合理导致的,导致一些内存泄漏的发生,系统大量使用swap.

这个时候最好能够重起动下服务器

论坛徽章:
0
4 [报告]
发表于 2005-01-25 12:38 |只看该作者

apache使用的一些心得

不应该叫uptime 应该是 load average


老是用命令uptime查load average,所以。。。

论坛徽章:
0
5 [报告]
发表于 2005-02-03 16:06 |只看该作者

apache使用的一些心得

uptime要超50呀。你的机器真棒。
一般超10就死掉了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-02-05 15:24 |只看该作者

apache使用的一些心得

呵呵。。。

有意思,不懂linux,系统方面的不好说,但是apache方面的,楼主还是应该多交流一下。

论坛徽章:
0
7 [报告]
发表于 2005-02-07 09:23 |只看该作者

apache使用的一些心得

难道还有人犯这样的错误"忘记关闭数据库连接"???????????????????
还是不要在这里提这些吧,这样的错误属于刚入门的程序员犯的.

论坛徽章:
0
8 [报告]
发表于 2005-03-03 10:52 |只看该作者

apache使用的一些心得

回:skylove

1。mod_limitipconn 是不是用来加速的,但是很多的服务器维护的人员往往在服务器负载较高时候选择了增加这个模块试图降低服务器的负载。所以我写这份东西的时候只是提个醒。

2。php加速的软件由于依赖于php版本之上,php版本的更新速度往往比加速软件的更新速度要快,如果你用过低版本的zend optimizer在php4.3.10上肯定存在问题;Performance Suite3.6.0里面带的zend optimizer是非常老的,相信你如果在php4.3.10上面用过的话,相信你zend Performance Suite的管理界面都打不来,直接500错误了。同样mmcache我使用了大概3个月时间,发现经常会出现一些古怪的问题,关闭了mmcache以后一切正常,中间那个环节出错了我还需要仔细查询下。另外象zend accelerator这样的软件需要使用共享内存,程序如果不合理的话,很容易造成共享内存消耗殆尽。

3。关于syn攻击,使用syn-cookie不能完全解决问题,你说的time_wait2可以探讨下,不过在proc里面没找到相应的值,能够更改的是tcp_syn_retries的次数,retry一次间隔30秒,如果对方攻击的机器效率没有问题的话,在30秒内可以建立足够的SYN_RECV来消耗你的内存。

4。rewrite只是一个解决问题的方式之一,当然有其他特殊的需要考虑用其他方式

5。squid不做评论

6。特别申明下 cpu利用率跟load average完全是两个概念,cpu过利用率过50%是很正常的,但是可能load average的值只有1多点;load average是一个系统处理繁忙程序的值,cpu利用率会呼高呼下,但load average是一个相对平稳的值。我很难相信linux在load average 持续50以上能正常工作,继续增长带来的结果肯定意味着菪机。你如果tar一堆文件都能导致load average会倒50的话,可以检查下你的系统,我在机器有着4000个联结的时候,照样编译内核都不会超过50。

7。我很想问下你维护很重的机器MaxClient开到多少,如果超过6000的话留个msn我们探讨下,这个一值是我比较困挠的问题

论坛徽章:
0
9 [报告]
发表于 2005-03-03 11:00 |只看该作者

apache使用的一些心得

to acaluis
因为php有一个很好的机制在程序退出以后自动关闭数据库联结,所以很多程序包括很多软件都没有在使用完数据库以后立即关闭数据库联结的习惯。或者在php执行完成前加一个mysql_close(). 对于负载不高的系统这个问题不大,不需要大多的关于,因为php执行完成以后自动会回收资源。

但是如果机器负载很高,php执行的速度变慢以后,没有及时关闭数据库的后果肯定是大量的数据库联结保持在那里。相信很多你访问很多php写的网站(包括一些大型网站)经常出现超过系统最大联结数的问题

论坛徽章:
0
10 [报告]
发表于 2005-03-03 19:49 |只看该作者

apache使用的一些心得

回楼主:
1.既然不是加速的,为什么原文要写作加速的?是否有误导之嫌??

2.加速软件支持4.3.10版本的php的,我在使用中一切正常,至于您谈到的问题——恐怕真的是您的php写作上存在问题??

3.对待ddos,没有谁敢说自己有能力对付,syncookie也一样

4.既然你转而说是解决问题的方式之一,为何在原文中以嘲讽的语气评价1000个虚拟主机者?

5.squid的加速至少减少了apache申请到html(静态页面)时候进行权限判断,嵌入资源权限判断等消耗;

6.4000个连接与tar无关,如果您不清楚tar程序可以用做backup作用,那么此问题可以原谅

7.我没见过人用一台apache带真正超过3000并发请求的做法,既然您提到的请求是6000,那么想来您实现过最大连接5000时候的情形? 我不认为这个值可以在一台机器上做到。

最后一问:如果按照你的说法,你是在写作此帖以前就明白了那些道理的,那么为什么写出“xxx加速模块”这样的原文,您是对自己的文字不负责,还是对自己在cu的id不负责,或者是对cu的各位读者们觉得不需要负责??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP