PHP网站首页打不开的原因讲起
最近有个网站首页打不开,偶尔报504错误,如图所示,这是nginx直接返回的。今天下午16:00多又出现了,看了下阿里云数据库连接,其实在晚上2:00也出现了一次。这个图是后来问题已经解决了获取的,数据库连接的请求数已经降下来了。现在似乎是数据库压力很大,由于我们的数据库服务器同时有好几个库在线上,并不确定是其他系统把数据库拖垮还是当前这个系统的原因。使用语句查询数据库的会话数SQLSERVER
最近有个网站首页打不开,偶尔报504错误,如图所示,这是nginx直接返回的。
今天下午16:00多又出现了,看了下阿里云数据库连接,其实在晚上2:00也出现了一次。这个图是后来问题已经解决了获取的,数据库连接的请求数已经降下来了。
现在似乎是数据库压力很大,由于我们的数据库服务器同时有好几个库在线上,并不确定是其他系统把数据库拖垮还是当前这个系统的原因。
使用语句查询数据库的会话数
SQLSERVER 查看当前连接数
Select * from sys.dm_exec_connections --此命令可以看到有多少人在连
Select * from sys.dm_exec_sessions --此命令可以看到有多少会话,一个连接可以有多个会话
从图中大致定位到还是之前报504的网站对数据库的请求数很多。
定位到具体应用就可以上对应的服务器去进一步去查
先看CPU是比较正常的
再查PHP-FPM的进程数
正常情况下php进程只有10个左右,一下子变成这么多肯定说明是外界有很大的请求数。
但是为了确定是不是php出现什么异常导致进程无法结束,所以结束所有进程,重启php-fpm.。
发现没过多久又出现很多的进程数,所以可以得出结论:这说明nginx报504的原因是外界的请求是持续的,导致数据库压力巨大请求不过来,所以nginx报504。
然后查这个时候的nginx日志最近500条数据
#tail -n 500 /usr/local/nginx/logs/access.log >>500_20160218-1712.txt
从日志里看出主要是百度和搜狗的蜘蛛在爬行,百度是一直在爬行的,应该是比较稳定不会导致网站突然流量剧增,而且据说百度会控制访问的频率,保证不把网站爬挂。
看来后面的日志,发现这个时间段搜狗的蜘蛛爬行数量是非常多的,由于蜘蛛是用集群在爬,所以屏蔽IP是没用的,只能在nginx里屏蔽请求头。
server {
listen 80;
root /www/;
index index.php;
#禁止特定爬虫的抓取
if ($http_user_agent ~* "Sogou web spider") {
return 403;
}
然后重新结束php进程,启动php进程,发现整个进程是非常平稳的维持在10个
说明就是搜狗搞的事情,当务之急只能先这么着了,谁让搜狗没有多少用户群呢,后续的解决方案还是使用缓存,所以从这个事情得出一条非常重要的结论,尽量使用缓存,不要因为网站现在很稳定就不使用缓存,因为网站随时会遇到这种访问量突发的情况。
屏蔽搜狗之前:
屏蔽搜狗之后:
下面是从nginx日志中分析出来的各种蜘蛛对网站的爬行数据排名靠前的几个,其实已经屏蔽了谷歌等很多用处不大的爬虫,但是还是有很多爬虫在爬:
看的出来搜狗一天怕了不少。
特定IP抓取网站数据,其实是和指针类似,但是这类抓取一般会不定时,所以需要监控php进程,及时屏蔽对方IP
监控php-fpm进程数
#!/bin/sh
echo `date '+%Y-%m-%d %H:%M:%S'` "php进程数>>>"`ps -ef | grep php-fpm | wc -l` >> /usr/wwwyuanboweb/phpfpm.txt
如果要做进程不存在重启之类的事情
#!/bin/sh
ps -ef | grep php-fpm | wc -l
if [ $? -ne 0 ]
then
echo "start process....."
else
echo "runing....."
fi
#####
需要windows到linux转码
# yum install -y dos2unix
# dos2unix ./t.sh
或者
vi t.sh
:set fileformat=unix
:wq
还需要给shell脚本权限
#chmod +x ./t.sh
#contab -e
*/1 * * * * /bin/bash /usr/wwwyuanboweb/t.sh
查指定时间段的nginx日志
# sed -n '/23\/Feb\/2016:13:45:00/,/23\/Feb\/2016:13:50:59/'p /usr/local/nginx/logs/access.log>>20160223-1345-1350.txt
屏蔽指定的IP
通过iptables屏蔽某些或者某个IP地址达到屏蔽效果
# iptables -I INPUT -s 192.168.38.174 -j DROP //屏蔽单个ip
# iptables -I INPUT -s 192.168.38.0/100 -j DROP //屏蔽某段ip
网站监控数据
更多推荐
所有评论(0)