作者归档:superaj

Linux 监控VPS服务器负载/CPU

主要用于监控 linux 服务器负载及内存占用,如 MySQl、php-fpm,当负载或内存占用达到设置值后,便自动重启该进程以避免宕机。
# 设置最大内存占用百分比
PID_MEM_MAX=”85″

# 设置最大系统负载
SYS_LOAD_MAX=”3″

# 设置需要监控的服务名称
NAME_LIST=”php-fpm mysql”

for NAME in $NAME_LIST
do
# 初始化内存统计
PID_MEM_SUM=0

# 获取该程序总进程数
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`

# 列出每个进程内存占用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk ‘{print $4}’`

# 计算所有进程总内存占用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done

# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`

# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$PID_MEM_SUM”‘>='”$PID_MEM_MAX”‘?”1″:”0″)}’`
LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>='”$SYS_LOAD_MAX”‘?”1″:”0″)}’`

# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
/etc/init.d/$NAME stop
sleep 3
# 强制关闭
pkill $NAME

# 重启
/etc/init.d/$NAME start
#写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
echo “$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” > /dev/null
fi
done

以上代码保存为一个文件,例如:auto_reboot.sh

添加计划任务,设置每分钟检查一次

crontab -e
* * * * * /bin/bash/root/auto_reboot.sh

注意文件的位置要搞正确。
请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
bc -v

如果没有安装,centos可以用 yum -y install bc 安装它
可以使用命令
sh /bin/bash/root/auto_reboot.sh

测试以上脚本,如果出现 syntax error near unexpected token `do 这样的错误请查看本站文章《Linux 下sh脚本执行时出现 syntax error near unexpected token `do 错误的解决方法 》一文。

CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本:

#!/bin/sh
#usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# 设置最小剩余内存,一般至少要剩余50M可用(单位兆)
FREE_MEM_MIN=”50″
# 设置最大系统负载
SYS_LOAD_MAX=”3″
# 设置重启服务的最小剩余内存(单位兆)
RESTART_FREE_MEM_MIN=”500″
# 设置需要监控的服务名称
NAME_LIST=”httpd mysqld”
for NAME in $NAME_LIST
do
# 获得剩余内存(单位兆)
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
# 获得已用内存(单位兆)
#FREE_MEM=`free -m|grep Mem|awk ‘{print $3}’`
# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`
# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘<'"$FREE_MEM_MIN"'?"1":"0")}'` LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='”$SYS_LOAD_MAX”‘?”1″:”0″)}’`

# 测试结果
#LOAD_VULE=”1″
#echo $(date +”%y-%m-%d %H:%M:%S”) “DEBUG $NAME” “(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)”>> /var/log/autoreboot_debug.log

# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
service $NAME stop
sleep 3
# 强制关闭
skill $NAME
# 重启
sleep 10
for i in 1 2 3
do
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>='”$RESTART_FREE_MEM_MIN”‘?”1″:”0”)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
fi
done

# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>='”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
else
echo “$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” > /dev/null
fi
fi
done

PHP http抓取类 HttpRequest

static function HttpRequest($url, $data=array(), $abort=false) {
		if ( !function_exists('curl_init') ) { return empty($data) ? self::DoGet($url) : self::DoPost($url, $data); }
		$timeout = $abort ? 1 : 2;
		$ch = curl_init();
		if (is_array($data) && $data) {
			$formdata = http_build_query($data);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $formdata);
		}
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		$result = curl_exec($ch);
		return (false===$result && false==$abort)? ( empty($data) ? self:: DoGet($url) : self::DoPost($url, $data) ) : $result;
	}
	static public function DoGet($url){
		$url2 = parse_url($url);
		$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
		$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
		$host_ip = @gethostbyname($url2["host"]);
		$fsock_timeout = 2;  //2 second
		if(($fsock = fsockopen($host_ip, $url2['port'], $errno, $errstr, $fsock_timeout)) < 0){
			return false;
		}
		$request =  $url2["path"] .($url2["query"] ? "?".$url2["query"] : "");
		$in  = "GET " . $request . " HTTP/1.0\r\n";
		$in .= "Accept: */*\r\n";
		$in .= "User-Agent: Payb-Agent\r\n";
		$in .= "Host: " . $url2["host"] . "\r\n";
		$in .= "Connection: Close\r\n\r\n";
		if(!@fwrite($fsock, $in, strlen($in))){
			fclose($fsock);
			return false;
		}
		return self::GetHttpContent($fsock);
	}

	static public function DoPost($url,$post_data=array()){
		$url2 = parse_url($url);
		$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
		$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
		$host_ip = @gethostbyname($url2["host"]);
		$fsock_timeout = 2; //2 second
		if(($fsock = fsockopen($host_ip, $url2['port'], $errno, $errstr, $fsock_timeout)) < 0){
			return false;
		}
		$request =  $url2["path"].($url2["query"] ? "?" . $url2["query"] : "");
		$post_data2 = http_build_query($post_data);
		$in  = "POST " . $request . " HTTP/1.0\r\n";
		$in .= "Accept: */*\r\n";
		$in .= "Host: " . $url2["host"] . "\r\n";
		$in .= "User-Agent: Lowell-Agent\r\n";
		$in .= "Content-type: application/x-www-form-urlencoded\r\n";
		$in .= "Content-Length: " . strlen($post_data2) . "\r\n";
		$in .= "Connection: Close\r\n\r\n";
		$in .= $post_data2 . "\r\n\r\n";
		unset($post_data2);
		if(!@fwrite($fsock, $in, strlen($in))){
			fclose($fsock);
			return false;
		}
		return self::GetHttpContent($fsock);
	}
	static private function GetHttpContent($fsock=null) {
		$out = null;
		while($buff = @fgets($fsock, 2048)){
			$out .= $buff;
		}
		fclose($fsock);
		$pos = strpos($out, "\r\n\r\n");
		$head = substr($out, 0, $pos);    //http head
		$status = substr($head, 0, strpos($head, "\r\n"));    //http status line
		$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
		if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
			if(intval($matches[1]) / 100 == 2){
				return $body;
			}else{
				return false;
			}
		}else{
			return false;
		}
	}

 

csshack

CSS hack:区分IE6,IE7,firefox
区别不同浏览器,CSS hack写法:
区别IE6与FF:
background:orange;*background:blue;
区别IE6与IE7:
background:green !important;background:blue;
区别IE7与FF:
background:orange; *background:green;
区别FF,IE7,IE6:
background:orange;*background:green;_background:blue;
background:orange;*background:green !important;*background:blue;
注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*;不能识别 !important;
IE7能识别*,能识别!important;
FF不能识别*,但能识别!important;
IE6 IE7 FF
* √ √ ×
!important √
√ √
浏览器优先级别:FF

postfix服务器创建

一、准备工作

1. 为邮件服务器添加DNS解析

虽然不加DNS解析也能把邮件发出去,但会被大多数邮件服务器当作垃圾邮件。根据我们的实际经验,需要添加三条DNS解析记录:A记录、MX记录、TXT记录。比如域名coolaj.cn,对应的DNS记录如下:
A mail
MX mail.xxx.com
TXT v=spf1 mx -all

2. 准备存放邮件的硬盘空间

如果用的是阿里云入门级Linux服务器,有一块20G的数据盘未挂载,需要格式化并挂载(假设这里挂载的目录是/data),具体操作步骤见之前的博文阿里云云服务器硬盘分区及挂载。

二、配置postfix

postfix是CentOS默认安装的邮件服务器软件。以下配置示例假设要配置的域名是coolaj.cn,邮件服务器主机名是mail.coolaj.cn。

1. 打开postfix的配置文件 阅读全文 ……

自己设计修改一些常用的bat文件

清除所有盘垃圾(以前的只是系统盘,我改了多几个盘符,能清除到到G盘)【修改版】 ­

 

要轻松流畅上网你是否注意到你的电脑系统磁盘的可用空间正在一天天在减少呢?是不是像老去的猴王一样动作一天比一天迟缓呢? ­

没错!在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:*.tmp、*._mp)日志文件(*.log)、临时帮助文件(*.gid)、磁盘检查文件(*.chk)、临时备份文件(如:*.old、*.bak)以及其他临时文件。特别是如果一段时间不清理IE的临时文件夹 “Temporary Internet Files”,其中的缓存文件有时会占用上百MB的磁盘空间。这些LJ文件不仅仅浪费了宝贵的磁盘空间,严重时还会使系统运行慢如蜗牛。这点相信你肯定忍受不了吧!所以应及时清理系统的LJ文件的淤塞,保持系统的“苗条”身材,轻松流畅上网!朋友来吧,现在就让我们一起来快速清除系统垃圾吧!!下面是步骤很简单就两步! ­

在电脑屏幕的左下角按“开始→程序→附件→记事本”,把下面的文字复制进去(红色部分),点“另存为”,路径选“桌面”,保存类型为“所有文件”,文件名为“清理系统垃圾文件.bat”,就完成了。记住后缀名一定要是.bat,ok!你的垃圾清除器就这样制作成功了! ­

双击它就能很快地清理垃圾文件,大约一分钟不到。 阅读全文 ……

完美解决Nginx 504 Gateway time-out

最近用dedecms建的一个网站新增了大批内容,有三个栏目的内容量都超过了两千篇,超过两千三百篇的两个栏目在生成栏目列表的时候就出现了504 Gateway time-out 服务器用的是nginx,我不是很懂,服务器维护人员在网上随便找了一篇文章,修改了nginx的缓存设置,不管用,他就不管了,可是我不能不管啊,不能生成列表页面,那后面的内容不是都不能用了么?

把数据库下载到本地,在本地配置了nginx,试了很多遍,都不行,又改到Apache下面,更夸张,生成了83个页面就不能继续了,看来还是nginx更厉害一点,虽然出现504 Gateway time-out,但好歹能够全部生成。

只好又继续在网上找更多的解决办法,尝试了N多次以后,终于让我找到了一个有用的方法,想想以后可能还有碰到这样的问题,就把那篇文章复制过来放在这里,供以后参考吧,对有同样问题的朋友也是一个帮助。

下面部分是引用部分,我自己不懂技术的,在我的dedecms5.6里面有用,别人的自己尝试吧。
Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。

Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。

而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。

以我目前的服务器为例子CPU是奔四1.5G的,内存1GB,CENTOS的系统,访客大概是50人左右同时在线。

但是在线的人大都需要请求PHP-CGI进行大量的信息处理,因此我将nginx.conf设置为: 阅读全文 ……

flashfxp备份

*.fqf 只读状态

 

选项\”当文件存在先项”的设置中设置成:
1.”文件较小时—覆盖” || “文件相同时–跳过” || “文件较大时—覆盖”

2.完成后关闭

 

autobak.bat:
代码如下:

CD X:\xxx\FlashFXP 
For /F %%f in (files.log) do (del %%f) 
dir *.fqf /b >files.log 
For /F %%f in (files.log) do (start flashfxp.exe %%f)

 

利用 lftp 为VPS/其他系统镜像备份

安装: yum install -y lftp

 

lftp mirror的参数如下:

 

-c, –continue 如果可能, 继续一个镜像任务

 

-e, –delete 删除在远程站点不存在的文件

 

-s, –allow-suid 根据远程站点设置相应的 suid/sgid 位

 

-n, –only-newer 只下载新的文件 (-c 没有作用)

 

-r, –no-recursion 不下载子目录

 

-p, –no-perms 不设置文件权限

 

–no-umask 不在文件上使用umask

 

-R, –reverse 反向镜像 (上传文件)

 

-L, –dereference 下载符号链接指向的文件

 

-N, –newer-than FILE 只下载比文件 FILE 更新的文件

 

-i RX, –include RX 包括匹配的文件 (只能使用一次)

 

-x RX, –exclude RX 不包括匹配的文件 (只能使用一次)

 

RX 是括展的正则表达式

 

-t Nx, –time-prec Nx 设置时间精度为 N 秒 (x=s) 分钟 (x=m) 小时 (x=h) 或者天 (x=d) 默认值 – 12 小时

 

-v, –verbose 显示详细的信息

 

–log=FILE 将执行过的命令写入日志文件<FILE>

 

–script=FILE 把命令写入脚本文件但不执行

 

–just-print, –dry-run 同 –script=<>FILE

 

当使用 -R 参数时,第一个目录为本地目录,第二个为远程目录

 

如果第二项没有填写,则采用第一个个目录的名称

 

如果两项都没填写,则采用当前的本地和远程目录

 

 

 

那么,具体是如何实现的呢?

 

1、新建一个脚步, test.txt

 

test.txt 内容如下:

 

open ftp://备份空间用户名:备份空间密码@备份空间地址

 

mirror -R -v -n -e 源文件目录 目标站目录  (把-e去掉,就不会删除目标目录废弃的文件)

 

例如:

open ftp://lftptest:123456@192.168.3.11

 

mirror -R -v -n -e /root/test/ /public_html

即是将/root/test/目录下的所有文件上传到ftp://192.168.3.11/mirror目录下。

2、新建sh脚本, upload.sh

upload.sh 内容如下:

#!/bin/bash

lftp -f /root/test.txt

记得给 upload.sh 赋可执行权限: chmod 755 /root/upload.sh

3、设置自动任务

crontab -e

加入:

每天,4时

0 4 * * * /root/upload.sh;

每周六,4时:

0 4 * * 6 /root/upload.sh;

如果两边都是独立的操作系统或VPS,可使用rsync来同步文件。

 

 

参考设置

set ftp:charset gbk

set file:charset utf-8

set ftp:passive-mode off

Linux下cp直接覆盖不提示的方法!

新做了服务器,cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的。。。

  把a目录下的文件复制到b目录
  cp –r a/* b
  执行上面的命令时,b存在的每个文件都会提示是否覆盖;
  cp –r –f a/* b
  执行上面的命令时,b存在的每个文件都不再会提示;
  这是我们希望的理想状态,但是有时加了-f了,怎么还会有提示呢?原来一些服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i。
  在终端执行alias就可以看出来了。
  [root@devdb ~]# alias
  alias cp=’cp -i’
  可以这样解决
  [root@devdb ~]# vi ~/.bashrc
  在alias cp=’cp -i’前加上”#”注释掉这行,:wq!保存推出,然后重新登陆就可以了。
=================================
alias cp=”cp -f”
直接输入以上命令,在当前shell生效。放入 ~/.bashrc 中,以后的新shell中都生效(当前shell不生效,退出再重新login以后生效)
此法新手慎用

nginx 502 Bad Gateway 错误解决办法

一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考:

Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句 502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件

502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;

不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……

503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep "php-cgi" | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http  {
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  ......
  }
  ......

php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

如果这样修改了还解决不了问题,可以参考下面这些方案:

一、max-children和max-requests

一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右。

最近经常会出现这样的情况:php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了。

检查php-fpm的日志文件发现了一些线索。

Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200  Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″  Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll  Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志。

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个 children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间 被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf调大以下两个参数(根据服务器实际情况,过大也不行)

<value name="max_children">5120</value>  <value name="max_requests">600</value>

然后重启php-fpm。

二、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)问题解决了,执行很长时间也不会出错了。优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。