nginx和fpm的进程数配置和502,504错误

摘要:
502和php-fpm.conf1.hp-cgi进程的数量不足。php-fpm的超时很短。当当前进程执行超时时,连接将关闭。因此,Nginx将发现与自身通信的连接已断开,并将向客户端502返回一个错误。request_terminate_Timeout设置太长:request_termnate_如果超时值设置为0或花费太长时间,则可能会导致内容的file_get_Resources。这样,当所有php-cgi进程都被困在file_get_In的contents()函数中时,这个Nginx就不能再处理新的请求,Nginx将向用户返回“502BadGateway”。例如,将其更改为30s。如果文件发生_ get_内容()获取网页内容很慢,这意味着150个php cgi进程每秒只能处理5个请求。WebServer也很难避免“502BadGateway”。

 502 和 php-fpm.conf

1.php-cgi进程数不够用。php执行时间长,导致没有空闲进程处理新请求。

2.php-cgi进程死掉。php-fpm超时时间短,当前进程执行超时关闭连接。

实例:

1.request_terminate_timeout引起的资源问题

request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。

php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,request_terminate_timeout可以覆盖max_execution_time,所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。

request_terminate_timeout设置过短:

当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程(进程会被kill掉,用strace看是这样的)。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。此时nginx错误日志日志中会出现“104: Connection reset by peer”。

request_terminate_timeout设置过长:

request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx无法再处理新请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免”502 BadGateway”。

解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给 file_get_contents加一个超时参数。

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 10    //设置一个超时时间,单位为秒
    )
));
 
file_get_contents($str, 0, $ctx);

2.max_requests参数配置不当,可能会引起间歇性502错误:

pm.max_requests = 1000

设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的.

设置为 ‘0’ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

但是为什么要重启进程呢?

一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。

正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在PHP5.3.3 中是否还存在这个问题。

目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实 际情况设置这个值,不能盲目地加大。

话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。

 

2.504 和 nginx.conf

Nginx 504 Gateway Time-out则是与nginx.conf的设置有关;

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

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

也可以写到server段:

http://blog.csdn.net/dc_726/article/details/11950189

讲的很详细,好好看看。


3. 413 Request Entity Too Large

增大client_max_body_size

client_max_body_size:指令指定允许客户端连接的最大请求实体大小,它出现在请求头部的Content-Length字段. 如果请求大于指定的值,客户端将收到一个"Request EntityTooLarge" (413)错误. 记住,浏览器并不知道怎样显示这个错误.解决办法是在php.ini中增大post_max_size 和upload_max_filesize

免责声明:文章转载自《nginx和fpm的进程数配置和502,504错误》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分布式模式之Broker模式(转)mysql批量插入,批量更新下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP加密方法-用Zend Encoder加密PHP文件和PHP 优化配置(PHP文件加密)

在发布一个你写好的PHP程序时,你是不是担心自已辛苦写出来的成果会被别人占为已有呢?其实我们可以用Zend Encoder为我们的PHP文件加上一层保护壳。 软件版本:2.0.1 软件大小:10.2M 适用平台:Win9X/2000/XP 官方网址:http://www.zend.com/store/products/zend-encoder.php 软件...

php变量和字符串连接符——点

连接符——点,本身也是一种运算符。它真正的名字应该叫“字符运算符”。作用是把两个字符串连接起来。 echo 字符 . 变量 . 字符;  //点号把三个值连接成为一个,运行正常。 例: 1.字符串+变量+字符串 echo("<!--".$result."-->"); 2.变量+变量echo($result.$result); 3.字符串+变量...

【nginx】大文件下载

nginx自带文件读取功能,而且实现地很好。 比如直接读取txt文件,png图片等,用chrome可以直接获取到内容。 但是对于很大的文件,比如有2个G的视频,nginx如何吐出2G的内容呢? 实验: 准备很大的MP4文件(比如2G),nginx搭建好webserver,nginx开启access_log选项(log中要包含下载文件大小,http code...

Nginx超时timeout配置总结

具体参数解释 Nginx 处理的每个请求均有相应的超时设置。如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提升 Nginx 的性能。 keepalive_timeout HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输...

PHP 设计模式 笔记与总结(5)PHP 魔术方法的使用

PHP 魔术方法的使用 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\Commo...

JNI内存使用问题(转载)

程序员在使用 JNI 时应当认识到 JNI 编程中如下的几点弊端,扬长避短,才可以写出更加完善、高性能的代码: 从 Java 环境到 native code 的上下文切换耗时、低效。 JNI 编程,如果操作不当,可能引起 Java 虚拟机的崩溃。 JNI 编程,如果操作不当,可能引起内存泄漏。 1.jni内存泄露从两个方面来说 1)JVM中的java...