【问题标题】:nginx HTTP Error 500 when retrieving 1 Million rows检索 100 万行时 nginx HTTP 错误 500
【发布时间】:2013-04-13 08:23:32
【问题描述】:

使用 nginx 1.7 和 PHP(Laravel 框架)从 PostgreSQL 数据库中检索 1+ 百万行导致错误 500 在 10 秒内显示。

HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfill the request.

我已经将一些超时设置为更长并重新加载了 nginx,但它无法正常工作。哪些设置可以防止这种超时?

启用网站

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_read_timeout 6000;
    fastcgi_send_timeout 6000;
    client_body_timeout 6000;
    send_timeout 6000;
    proxy_read_timeout 6000;
}

【问题讨论】:

  • 你确定超时在nginx,而不是在PostgreSQL或FastCGI? NginX 应该给你一个 504 错误,而不是 500 错误。尝试在没有 NginX 的情况下加载相同的页面,看看会发生什么。不过,也请查看client_header_timeout 指令,以防万一。
  • 我可以使用 pgAdmin3 软件从 PostgreSQL 中检索所有 1M 行,因此 PostgreSQL 不是超时的。设置client_header_timeout 6000,我仍然得到同样的错误500。我应该如何调整FastCGI超时?
  • pgAdmin3 很可能会以不同于 Laravel 的方式处理这些行。你可以绕过nginx 访问 Laravel 页面吗?无论如何,请参阅下面的暂定答案以获取可能的线索和处理方式。

标签: php postgresql nginx laravel laravel-4


【解决方案1】:

解释我有点神秘的评论,并提供一个可能的答案:

看起来不像是超时,这应该会使nginx 发出504 Gateway Timeout 错误。 HTTP 错误 500 表示实际上存在 错误,即:

  • PHP (Laravel) 内存不足
  • PostgreSQL 连接已中止
  • FastCGI 进程放弃了幽灵

所以你有三个地方可以检查:fastcgi 日志、Laravel/PHP 错误日志,可能还有 PostgreSQL(不太可能,因为 PostgreSQL 不应该有处理数百万行的问题 - 但可能存在内存问题) .

直接加载页面,而不从nginx 传递,无论如何,如果您不想或不能检查日志,应该会给出更多信息错误。

我的钱将用于 PHP 层中的内存错误,或者失败,用于 FastCGI 中的资源(内存和/或 CPU)耗尽问题。

如果是这样,您可能可以通过在php.ini 中允许 PHP 进程占用更高的内存来快速解决问题;或者更好的是,重新设计流程,使其不接收太多数据(您肯定不会显示一百万行;也许您正在 PHP 中进行一些可以在 PostgreSQL 级别更好地完成的处理?)。

【讨论】:

  • 原来是 PHP 内存问题。增加到 2GB 会有所帮助。谢谢!
  • 很高兴能够使用,但请记住最后一段 - 几乎可以肯定,无论您在做什么,都会有一种更快和/或更少内存密集型的方式。我不止一次地发现自己处于同一困境,而 PostgreSQL 对处理数据有很多支持——比 PHP 更好、更高效。 (您可能会就该主题或 dba 提出另一个问题)
  • 是的,我同意你的看法,我刚刚从 MySQL 迁移到 PostgreSQL,最终将在 PostgreSQL 中进行数字运算。添加我从 PostgreSQL 检索所有行并将它们排入作业队列 (beanstalkd) 的时刻
  • 通过 ORM 做这种工作通常是一个糟糕的主意;如果可能的话,使用普通的原生查询来迭代地获取和处理数据。您可以使用游标,这样您就不需要一次将大部分内容放入内存中。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多