zoukankan      html  css  js  c++  java
  • php nginx超时出错

    执行PHP操作大文件insert mysql数据库时,出现这个错误提示

    The page you are looking for is temporarily unavailable.
    Please try again later.

    set_time_limit(0)不限超时已经设置,并且PHP.INI中的错误提示已经打开,但还是出现上面的提示。

    于是,查看nginx的错误日志,发现这个错误

    2014/02/11 15:51:09 [error] 6085#0: *403 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.34, server: admin38.xx.com, request: "GET /osstest/fread.php?id=98 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "admin38.xx.com:1010"

    好象是超时了。。

    于是 修改nginx的配置文件conf

    报这个错误之后,整个服务器就不响应了,但是nginx后面的webpy程序没有任何错误,后端的数据库也很正常,从网上查了很多资料,都是说要修改proxy_read_timeout,proxy_send_timeout和proxy_buffer几个相关设置的值。

    如下配置,要放在server配置节之内

    large_client_header_buffers 4 16k;
    client_max_body_size 30m;
    client_body_buffer_size 128k;
    #proxy_connect_timeout 300;
    #proxy_read_timeout 300;
    #proxy_send_timeout 300;
    #proxy_buffer_size 64k;
    #proxy_buffers   4 32k;
    #proxy_busy_buffers_size 64k;
    #proxy_temp_file_write_size 64k;
    
    fastcgi_connect_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers   4 32k;
    fastcgi_busy_buffers_size 64k;
    fastcgi_temp_file_write_size 64k;

    你可以看到上面是proxy_和fastcgi_两种配置,就是说如果你的nginx后面是proxy,就设置proxy相关的配置,如果是fastcgi就设置fastcgi相关的配置。

    这里可以设置最大,如100000,

    这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。
      下面我们来仔细分析一下php-fpm.conf几个重要的参数:
      php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”
      我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。
      计算的方式如下:
      如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接 将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一 点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你 给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟 -30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
      而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就 会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左 右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于 我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间 也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
    fastcgi_read_timeout 300s;

    为防止万一,我在nginx.conf默认配置文件中也修改了最大时间。

    [plain] view plain copy
     
    1.  fastcgi_connect_timeout 100000;  
    2.  fastcgi_send_timeout 100000;  
    3.  fastcgi_read_timeout 100000;  
    4.  fastcgi_buffer_size 64k;  
    5.  fastcgi_buffers 8 64k;  
    6.  fastcgi_busy_buffers_size 64k;  
    7. #fastcgi_temp_file_write_size 64k;  


    做了上面2个设置后,重启一下

    /usr/local/nginx/sbin/nginx -s stop   //关闭服务器
    /usr/local/nginx/sbin/nginx  开启服务器

    php-fpm重启

    killall php-fpm 
    再执行(usr/local/php是php的安装目录)
    /usr/local/php/sbin/php-fpm


    NGINX反代理超时报错,解决方法:
    server {
            listen       80;
            server_name  *.xywy.com ;
            large_client_header_buffers 4 16k;
            client_max_body_size 300m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            proxy_buffer_size 64k;
            proxy_buffers   4 32k;
            proxy_busy_buffers_size 64k;
             proxy_temp_file_write_size 64k;
             ........................
     }

  • 相关阅读:
    JS阻止鼠标滚动
    仿淘宝订单列表下标指针
    自己动手模拟百分百<select>下拉列表
    专门用来存地址
    JS手动触发事件,转载
    刷新页面让显示区域回到顶部
    解决表格边框问题
    读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字
    读书笔记 effective c++ Item 42 理解typename的两种涵义
    读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8308550.html
Copyright © 2011-2022 走看看