Apache Nginx并存
因为多店铺批量做SEO,服务器不堪蜘蛛爬虫反向链接检查集中到来重负,现使用方案Linux CentOS服务器负载过高时自动重启Apache服务,虽然整体服务器不会死的很尴尬,但是技术人员后台操作的时候间歇遇到Apache重启,工作效率受到影响。
因此为服务器额外安装了Nginx,和Apache使用同个document root访问magento后台,服务器有多个IP,只需要配置Apache和Nginx使用不同的IP即可。
由于不同的IP,后台打开变快很多,如果能用不同的物理网卡,效果应该更好。
Linux CentOS服务器负载过高时自动重启Apache服务
最近在进行Magento的多店铺实践,200+产品,100+店铺,已经考虑到多店铺里的各种表可能会变得庞大,单页面的负载会比单店铺下要高,因此服务器配置比平时的配置多加了2G内存,此配置为:
Intel Quad Core Xeon X3220
Memory: 8 GB
网站域名解析并提交搜索引擎后,间或发现服务器无法响应,网站无法打开,只能提交主机商客服重启处理,重启后人工盯了一段时间TOP命令监测CPU Average平时为2左右,比单店铺的0.5-0.7要高许多,多店铺对资源的要求还是很高。观察一夜之后发现,CPU Average会偶然飙高到20+以上,对于4核CPU来说,这个数值意味着系统很难再为其他进程服务,这也就不难解释为什么SSH无法登录了。也观察了Apache Log发现这种情况发生的时候,有一些非蜘蛛亦非客户的请求过来,并发并不高,但是持续访问最终拖死了Apache。尝试将mod_php修改为fast_cgi后情况稍有改善,但是没有治本,服务器依然会死去。
经历了连续3次刚睡下被喊起来处理的痛苦后决定采用以下解决方案,在负载过高的时候杀死Apache,丢弃一部分访问换取服务器的长久运作,在进程杀死服务器之前,先杀死进程。
#!/bin/sh
TOP_SYS_LOAD_NUM=20
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
pkill httpd
sleep 10
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
Crontab增加如下调用,2分钟执行一次
*/2 * * * * /root/checkload.sh >>/root/checkload.log
先观察一下,下一步把对内存的监测也放上去。