zoukankan      html  css  js  c++  java
  • Nginx 504 Gateway Time-out分析及解决方法

    一、场景还原
    php程序在执行抓取远程图片库并保存至本地服务器的时候,出现了“504 Gateway Time-out”错误提示。

    问题定位:由于图片巨多,所以下载时间很长(10分钟以上),引起网关超时。

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

    通常以下几种情况会导致这个问题:

    1. 程序在处理大量的数据,或者有死循环之类的问题
    2. 创建数据库之类的连接因为某些原因连接不上,然后没有超时失败的机制,导致一直在创建连接
    3. 程序中有一些http请求,这些请求执行时间过长,导致超时。
    

      

    三、解决方法

    分别修改nginx及php的相关配置参数。

    1.修改Nginx配置( nginx.conf ):

    fastcgi_connect_timeout 1200s;#原设置为300s
    fastcgi_send_timeout 1200s;#原设置为300s
    fastcgi_read_timeout 1200s;#原设置为300s
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;

    这里最主要的设置是前三条,即

    fastcgi_connect_timeout #同 FastCGI 服务器的连接超时时间,默认值60秒,它不能超过75秒;
    fastcgi_send_timeout #Nginx 进程向 FastCGI 进程发送 request ,整个过程的超时时间,默认值60秒;
    fastcgi_read_timeout #FastCGI 进程向 Nginx 进程发送 response ,整个过程的超时时间,默认值60秒;

    2. 修改php配置文件

    php.ini
    max_execution_time = 300s;PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。
    php-fpm
    request_terminate_timeout = 0; #设置单个请求的超时中止时间.设置为0 即一直执行下去直到程序结束不会超时。

    修改完上述设置之后 再次执行发现没有出现504超时提示,但是页面空白,图片并没有下载成功。应该还是php在执行过程中超时。查看php代码,在程序开始处添加以下代码:

    set_time_limit(0);

    本函数用来配置该页最久执行时间。默认值是 30 秒,在 php.ini 中的 max_execution_time 变量配置,若配置为 0 则不限定最久时间。

    当执行到该函数时,才开始计算。例如,若默认是 30 秒,而在执行到该函数前已执行了 25 秒,而用本函数改为 20 秒,则该页面最长执行时间为 45 秒。

    再次执行,结果可以了。

    作者:哆啦C梦

    原文出自:《Nginx 504 Gateway Time-out分析及解决方法

  • 相关阅读:
    拖拽系列二、利用JS面向对象OOP思想实现拖拽封装
    拖拽系列一、JavaScript实现简单的拖拽效果
    CSS3中三角形及三角形组合图实现
    计算机内存管理介绍
    [Leetcode]双项队列解决滑动窗口最大值难题
    [Leetcode]827.使用回溯+标记解决最大人工岛问题
    计算机启动过程
    [Leetcode]895.最大频率栈
    GDB查看内存(x 命令)
    理解递归
  • 原文地址:https://www.cnblogs.com/sandaizi/p/10710187.html
Copyright © 2011-2022 走看看