【问题标题】:Nginx php-fpm 504 gateway errorNginx php-fpm 504 网关错误
【发布时间】:2017-08-11 22:42:17
【问题描述】:

经过数小时的搜索和调试,我放弃了!

关于长期运行的 PHP 进程有成千上万的问题和文章,但没有一个能解决我的问题。

我有一个包含以下代码的 PHP 脚本:

$cur = 0; 
    // Second, loop for $timeout seconds checking if process is running 
    while( $cur < 31 ) { 
        sleep(1); 
        $cur += 1; 

       echo "\n ---- $cur ------ \n";
    }

它只是打算运行 31 秒。

我有一个 Nginx,PHP 在 debian 服务器中配置为 fastcgi。

我设置 max_execution_time = 600

/etc/php5/fpm/php.ini

我什至把它设置在

/etc/php5/cli/php.ini

也设置

request_terminate_timeout = 600

在 /etc/php5/fpm/pool.d/www.conf

我也在 nginx.conf http 部分进行了这些更改

client_header_timeout   600;
client_body_timeout     600;
send_timeout           600;

fastcgi_read_timeout    600;
fastcgi_send_timeout    600;
client_max_body_size    600;
fastcgi_buffers         8 128k;
fastcgi_buffer_size     128k;

并将指令放在服务器部分。以及 nginx 配置的 location 部分中的这些指令

send_timeout           600;

fastcgi_read_timeout    600;
fastcgi_send_timeout    600;
client_max_body_size    600;
fastcgi_buffers         8 128k;
fastcgi_buffer_size     128k;

但是我还是在浏览器中遇到网关超时错误! (是的!我重启了 php-fpm 和 nginx 数千次)

你们有什么想法吗?

【问题讨论】:

  • 我认为来自 nginx error_log 的代表行(如果可用)会有所帮助。
  • 总有一天,没有一条错误行会让你难过!
  • 哎呀,太苛刻了。有我的同情。或许debug log可以启发你?坦率地说,你的配置看起来还不错。
  • 哦,谢谢你这么好。调试是个好主意。我不知道调试选项。但不幸的是,它没有打印任何有用的信息。唯一类似于错误的行是 readv() 未准备好(11:资源暂时不可用),我认为这是非阻塞 IO 的正常现象
  • 因为我没有想法:您能否向我们展示一下配置中 nginx 将请求传递给 php-fpm 的部分?包含fastcgi_pass 的节?

标签: php nginx fastcgi http-status-code-504


【解决方案1】:

请不要将我的回答视为侮辱,但是,您是否确保您的网络服务器已打开并且您是否尝试访问该网站的另一个页面?

【讨论】:

  • 哦。没问题。无论如何它已经启动并运行了
【解决方案2】:

看到this answer后,我倾向于认为情况如下:nginx正在尝试填充其FastCGI缓冲区(默认启用),而您的脚本返回第一个字节的时间过长,导致暂停。如果我是正确的,你需要做两件事来解决这个问题:

  1. fastcgi_buffering 切换为off
  2. 更改您的脚本,以便在每次迭代后调用 flush()ob_flush()

    while( $cur < 31 ) {
        ++$cur;
        echo "\n ---- $cur ------ \n";
    
        flush();
        ob_flush();
        sleep(1);
    }
    

【讨论】:

  • 我已经测试过 header('X-Accel-Buffering: no');我相信它也是如此,但没有解决任何问题。除此之外,对于我称为长时间运行的没有输出的 shell 脚本的其他测试,它仍然会给出网关错误...
  • 确实是it doesflush() 也没有帮助?
【解决方案3】:

我相信你需要在你的 Nginx 配置文件中包含proxy_read_timeout directive。我自己的配置文件是这样的:

server {
    proxy_read_timeout 300s;
    ...
}

你会注意到那在我的 server 块中,但是这个指令在 http 和 location 块中也是有效的。

*编辑添加,这是因为 Nginx proxies 向 PHP-FPM 服务器请求;您尝试使用的指令仅对 Nginx 本身提供的内容有效,并且被代理。

【讨论】:

  • 如果有的话,应该是fastcgi_read_timeout。并且 OP 已经将其设置得足够高。 nginx 的 Proxy 和 FastCGI 部分非常相似,但它们不互操作。
猜你喜欢
  • 2019-01-20
  • 2017-12-28
  • 2016-11-28
  • 2014-08-19
  • 2011-04-06
  • 1970-01-01
  • 2021-05-27
  • 2012-04-17
  • 2011-03-12
相关资源
最近更新 更多