【转】PHP-FPM进程CPU 100%的原因及解决方案

2014-07-02 17:51:42 查看评论 1223 人阅读    

最近有服务器不时出现的CPU使用率超高,内存几乎被吃光,系统甚至自动kill掉一些进程,如sshd,vsftpd等。用top查看,PHP-CGI进程高挂不下,如下是解决方案:
一、进程跟踪
# top //找出CPU使用率高的进程PID
# strace -p PID //跟踪进程
# ll /proc/PID/fd //查看该进程在处理哪些文件
将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间。


二、内存分配
如果进程跟踪无法找到问题所在,再从系统方面找原因,会不会有可能内存不够用?据说一个较为干净的PHP-CGI打开大概20M-30M左右的内存,决定于PHP模块开启多少。
通过pmap指令查看PHP-CGI进程的内存使用情况
# pmap $(pgrep php-cgi |head -1)
按输出的结果,结合系统的内存大小,配置PHP-CGI的进程数(max_children)。


三、监控
最后,还可以通过监控与自动恢复的脚本保证服务的正常运转。下面是我用到的一些脚本:
只要一个php-cgi进程占用的内存超过 %1 就把它kill掉

#!/bin/sh
PIDS=`ps aux|grep php-cgi|grep -v grep|awk’{if($4>=1)print $2}’`
for PID in $PIDS
do
echo `date +%F….%T`>>/data/logs/phpkill.log
echo $PID >> /data/logs/phpkill.log
kill -9 $PID
done


检测php-fpm进程
#!/bin/bash
netstat -tnlp | grep “php-cgi” >> /dev/null #2&> /data/logs/php_fasle.log
if [ "$?" -eq "1" ];then #&& [ `netstat -tnlp | grep 9000 | awk '{ print $4}' | awk -F ":" '{print $2}'` -eq "1" ];then
/usr/local/webserver/php/sbin/php-fpm start
echo `date +%F….%T` “System memory OOM.Kill php-cgi. php-fpm service start. ” >> /data/logs/php_monitor.log
fi

通过http检测php执行
#!/bin/bash
status=`curl -s –head “http://127.0.0.1:8080/chk.php” | awk ‘/HTTP/ {print $2}’`
if [ $status != "200" -a $status != "304" ]; then
/usr/local/webserver/php/sbin/php-fpm restart
echo `date +%F….%T` “php-fpm service restart” >> /data/logs/php_monitor.log
fi


Ps:这个尚未进行验证,先保存在这里。

转自:http://blog.163.com/lgh_2002/blog/static/44017526201281212938679/

分类: Nginx/Apache 标签: PHP-FPM 监控

记一次nginx 504超时

2014-05-30 09:34:33 查看评论 2573 人阅读    

公司使用的是haproxy做负载均衡,nginx+php+mysql的架构。由于后台有一个导入用户的功能需要执行的时间很长,页面上报错了504 Gateway Time-out。

关于504的说明

服务器(不一定是 Web 服务器)正在作为一个网关或代理来完成客户(如您的浏览器或我们的 CheckUpDown 机器人)访问所需网址的请求。
为了完成您的 HTTP 请求, 该服务器访问一个上游服务器, 但没得到及时的响应。
这通常意味着上游服务器已关闭(不响应网关 / 代理),而不是上游服务器和网关 / 代理在交换数据的协议上不一致。


因为使用量不大以及是内部人员使用的,懒得用队列之类的了。所以想着修改nginx的超时时间,让程序执行时间长一点。

修改nginx的配置文件。在http{}中增加以下配置

#fastcgi的超时配置,(针对后端的fastcgi 生效, fastcgi 不属于proxy模式)

fastcgi_connect_timeout 5;     #连接超时
fastcgi_send_timeout 300;      #写超时
fastcgi_read_timeout 300;      #读取超时

#Proxy: (针对proxy/upstreams的生效)

proxy_connect_timeout 15s;      #连接超时
proxy_read_timeout 300s;        #读超时
proxy_send_timeout 300s;        #写超时

另外配置php-fpm的超时时间

request_terminate_timeout = 300

重启nginx和php-fpm。


本来以为就大功告成了,没想到还是返回504超时。使用chrome查看超时时间为50s。查看nginx的错误日记也没找到超时的错误。

分类: Nginx/Apache 标签: haproxy 504 timeout

APP客户端上传文件引发NGINX返回411错误

2014-04-23 06:03:05 查看评论 1548 人阅读    

昨天和android客户端联调一个上传接口的时候,客户端报错:"java.io.FileNotFoundException",因为这个和IOS调试是正常的,然后我这边也没找到程序日记的请求记录,还以为是客户端的问题。

但是客户端查找了半天也没发现问题所在,没办法,查了下nginx的access日记。恍然发现,请求已经过来了,只是nginx返回411错误。

nginx给出的官方解释有三种情况会引发nginx弹411回去

client sent invalid "Content-Length" header
client sent method without "Content-Length" header
client sent "Transfer-Encoding: chunked" header

这个api使用的server正是nginx, 使用multipart提交图片文件的时候因为它忽略或省略了文件的真正的长度, 所以(通过抓包发现)在request header里就压根没有Content-Length. 那显然符合上面的第二种情况.

刚开始让android那边修改代码的,但是涉及到升级的问题,所以最好让服务端解决,google发现了这个nginx的module:nginxHttpChunkinModuleNginxHttpChunkinModule   

nginx1.3.9以上的版本不需要这个模块了,所以这个针对的是nginx1.3.9以下的版本。

分类: Nginx/Apache 标签: nginx 上传411