设为首页 收藏本站
查看: 1067|回复: 0

[经验分享] Apache使用的一些心得

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-1-1 12:02:41 | 显示全部楼层 |阅读模式
[转发老早的一篇文章]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学习心得
回复很刻薄
引用

一则误人子弟的文章
不解??那让我来说说看。。。
1。mod_limitipconn 不是用来加速的,其本身就是为了限制同一个ip的发起数,如果粗浅地说,这个功能的作用和我们机器上的 firewall类似。他本身是减慢了服务器的速度,但是其额外的好处是能阻止来自某一个ip的并发申请过大,比如一个用户开了100个进程来下文件这类情形的发生。因此,这个模块不是为了加速的,而是为了安全和均衡大多数人的利益;
2。关于php加速的——这类php加速的原理大致如此——把获得申请页面暂时保存到xx地方,在一定时间内(比如3秒内)获得完全一样的申请请求时,就直接使用缓存页面,这个可以大量减少php和数据库连接,生成页面的时间,而且不会有任何不利影响——至于说php编写有错,那么只会是把一个错误的文件缓存而已,并不会导致更为严重的后果;而且现在不少php程序已经开始主动地使用这类缓冲原理了,比如phpwind论坛就是一个例子。
3。关于syn的攻击,事实上用syn-cookie的作用不是太明显,用apache的一个专门防dos的模块作用更好一些,相反平时用 syn-cookie会导致服务器的请求变慢,最常用的做法不是syn-cookie,linux内核里有个参数是调整tcp/ip连接在 time_wait2时候的等待值的,那个更有作用用,具体各位可以去查一下。(已知freebsd和openbsd也有,用sysctl可以设置那个参数)
4。别人使用rewrite或者单独设置虚拟主机是根据别人的环境。比如我在设置虚拟主机的时候,同时需要 alisa www.aa.com cc.aa.com 到aa.com这个名字去呢??或者我要为每个用户单独地做流量统计分析呢,流量限制呢,我各个用户的要按照不同用户身份跑呢???用rewrite或者虚拟主机配置,是依据需要而来,莫名嘲笑别人1000个虚拟主机设置的才是笨蛋——你以为那真是那人手工配置的?那是程序自动生成的!比如cpanel这些成熟的虚拟主机程序(国内好象用的不多,国外很多)。。
5。apache建立连接的开销,分析比使用squid反向代理大,所以如果负载比较重,即使是静态html也是推荐用squid反向代理后更好。
6。负载大于50%的时候,正确的做法是检查哪个程序消耗了cpu最为厉害,而不是看到apache在用着就重新启动apache 。作者给的程序在真正实用环境里是没用的——比如我正在服务器上tar 数据文件,结果cpu过了50%,然后那个程序是自动运行,检查到此时apache在开着,就不断地重新启动apache,这样有用???正确的做法是检查了系统负载,进而应该检查此时apache的负载(perl的负载,mysql的负载)
7。我曾经维护过一台任务很重的服务器,其cpu利用率超过60%,其中apache 5%,mysql 10%,其他服务程序若干,结果服务器依然运作非常正常——cpu和内存一样,买来就是用的,放着99%的空闲你还不若去买个p2 366来用。时常cpu只是用到1%,没必要沾沾自喜,只能说明你没充分把机器利用起来,浪费了大好资源而已。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322455-1-1.html 上篇帖子: Apache ActiveMQ教程(一) 下篇帖子: apache common-net 学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表