为了 Nginx 不出现502错误而设置

林继 VPS 知识 1,868 共写了1117个字 (2012-06-17 22:01:06) 没有评论 打印 扫描二维码 百度未收录

今天网站也出现了“502 Bad Gateway” 错误,按网上的资料,我也跟着设置如下:

1. 检查 php.ini 文件 (在/usr/local/php/etc/目录下),eaccelerator配置项一定要放在Zend Optimizer配置之前,否则也可能引起 502 Bad Gateway;

2. 打开 /usr/local/php/etc/php-fpm.conf 文件,max_children 默认值是5,

  1. <value name="max_children">5</value>

网上有人对于有1G内存的VPS推荐”max_children”设成40(这是根据一个php-cgi进程大概占用20M内存,40就是800多M内存),不过,我保守点先将它改成30吧:

  1. <value name="max_children">30</value>

这样改好以后,重启php,

  1. /usr/local/php/sbin/php-fpm restart

发现真实内存的消耗明显上去了,原来只有不到30%,现在消耗超过80%了,用ps aux |grep php 查看,原来只有5个类似下面的 php-cgi进程,现在有30个了,看来设置起作用了。

  1. www       /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf

看着所剩无几的内存,心里莫名有点慌,后来又改成25了,想想原来默认值5也运行得还可以,现在扩大成5倍,应该差不多了吧,不行的话,以后再改。

查看实际的php-cgi的进程数:

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

查看实际php-cgi占多大内存:

  1. total=0; for i in `ps -C php-cgi -o rss=`; do total=$(($total+$i)); done; echo "PHP-CGI Memory usage: $total kb"

等到晚上高峰时间,用这些命令查看比较一下,看看设置的”max_children”值是否符合需要。

3. 对于request_terminate_timeout,默认设置为0s,先不管它,继续保持:

  1. <value name="request_terminate_timeout">0s</value>

4. 修改/usr/local/php/etc/php.ini 将max_execution_time 改为300,默认就是 300,不用改了。

5. 编写一个 Nginx 遇到”502 Bad Gateway”后,就自动重启php-fpm的脚本:

  1. cd /home/
  2. vi restart-php.sh

输入代码($url,$cmd根据自己情况而定):

  1. #!/usr/bin/php
  2. <?
  3. $url = 'http://www.xxx.com';
  4. $cmd = '/usr/local/php/sbin/php-fpm restart'; 
  5.  
  6. for($i = 0; $i < 5; $i ++){
  7.         $exec = "curl --connect-timeout 3 -I $url 2>/dev/null";
  8.         $res = shell_exec($exec); 
  9.  
  10.         if(stripos($res, '502 Bad Gateway') !== false){
  11.                 shell_exec($cmd);
  12.                 exit();
  13.         }
  14. }
  15. ?>

保存后退出。

  1. chmod 755 restart-php.sh
  2.  
  3. crontab -e

输入执行的代码:

  1. * * * * * /home/restart-php.sh

保存退出,意思为:每分钟执行一次restart-php.sh的脚本文件。用 crontab -l 查看任务是否设置成功。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

< >