2013-04-19 3 views
0

Использование nginx 1.7 & PHP (структура Laravel) для извлечения 1+ миллионов строк из базы данных PostgreSQL вызывает отображение ошибки 500 в течение 10 секунд.nginx HTTP Ошибка 500 при извлечении 1 миллиона строк

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; 
} 
+0

Вы уверены, что тайм-аут находится в 'nginx', а не в PostgreSQL или FastCGI? NginX должен дать вам ошибку 504, а не ошибку 500. Попробуйте загрузить ту же страницу без NginX и посмотреть, что произойдет. Однако также проверьте директиву 'client_header_timeout', на всякий случай. – LSerni

+0

Я могу получить все строки 1M из PostgreSQL с помощью программного обеспечения pgAdmin3, поэтому PostgreSQL не является одним из тайм-аутов. Установите 'client_header_timeout 6000', и я все равно получаю ту же ошибку 500. Как мне настроить тайм-ауты FastCGI? – Nyxynyx

+0

pgAdmin3, скорее всего, обработает эти линии иначе, чем Laravel. Можете ли вы получить доступ к странице Laravel в обход «nginx»? В любом случае, см. Предварительный ответ ниже для возможных подсказок и способов продолжения. – LSerni

ответ

1

Чтобы объяснить мою несколько загадочное комментарий, и поставить возможный ответ:

Это не выглядит как тайм-аут, который должен сделать nginx вопрос 504 Gateway Timeout ошибка. Ошибка HTTP 500 означает, что на самом деле была ошибка, то есть:

  • PHP (Laravel) вышел из памяти
  • Соединение PostgreSQL была прервана
  • Процесс FastCGI издыхают

Итак, у вас есть три места для проверки: журналы fastcgi, журнал ошибок Laravel/PHP и, возможно, PostgreSQL (маловероятно, поскольку PostgreSQL не должен иметь проблем с миллионами строк, но, возможно, есть проблемы с памятью).

Непосредственная загрузка страницы, не переходя от nginx, должна давать более информативную ошибку в любом случае, если вы не хотите или не можете проверить журналы.

Мои деньги были бы на ошибке памяти на уровне PHP или в противном случае на проблему исчерпания ресурса (памяти и/или процессора) в FastCGI.

Если это так, вы, вероятно, можете быстро решить проблему, разрешив более высокий объем памяти для PHP-процессов в php.ini; или лучше, перепроектируйте процесс так, чтобы он не занимал столько данных (вы, конечно же, не показываете миллион строк, может быть, вы делаете в PHP некоторую обработку, которая может быть лучше сделана на уровне PostgreSQL?).

+0

Оказывается, проблема памяти PHP. Увеличивается до 2 ГБ. Благодаря! – Nyxynyx

+0

Рад быть полезным, но, пожалуйста, помните о последнем абзаце - почти наверняка должен быть более быстрый и/или менее интенсивный в памяти способ делать то, что вы делаете. Я оказался в одном и том же состоянии более одного раза, и PostgreSQL имеет большую поддержку для хрустания данных - намного лучше и эффективнее, чем PHP.(Возможно, вы можете задать другой вопрос по этой теме или по ** dba **) – LSerni

+0

Да, я согласен с вами, я только что перешел с MySQL на PostgreSQL и в конечном итоге сделаю число, хруст в PostgreSQL. Добавьте момент, когда я извлекаю все строки из PostgreSQL и помещаю их в очередь на работу (beanstalkd). – Nyxynyx

Смежные вопросы