Назад | Перейти на главную страницу

Nginx закрывает соединение, пока PHP-Fpm обрабатывает

У меня есть сценарий PHP, который выполняет некоторую обработку данных. Время, необходимое сценарию для завершения всей работы, зависит от ввода пользователя. Нет ничего необычного в том, что на обработку уходит 5-15 минут.

На apache все работает нормально, но на Nginx соединение просто закрылось. Когда время обработки небольшое, все в порядке. Проблема возникает на длинных запросах ...

Ни в одном из журналов ошибок нет. Подозреваю, что браузер закрывает соединение.

Я обнюхал заголовки, и оказалось, что Nginx не отправляет никакого ответа, пока обработка не будет завершена. Ни одного заголовка.

Я пробовал отправлять заголовки из скрипта, но похоже, что nginx их все кеширует.

Впоследствии я отключил буферизацию вывода PHP и включил неявный сброс. Я отключил сжатие gzip и zlib. Я минимизирую FAST_CGI_BUFFERS до минимально допустимого, а именно: fastcgi_buffers 2 1k; fastcgi_buffer_size 1к; fastcgi_busy_buffers_size 1k; fastcgi_max_temp_file_size 0;

Тем не менее, он отказывается отправлять заголовки ...

Итак, чтобы доказать свою правоту, в одном из циклов внутри кода я выполнил var_export для одного из объектов ...

БУМ !!! - оно работает...

Кто-нибудь может придумать более элегантное решение?

Спасибо.

Обновление 19 августа

Происходит что-то безумное. После того, как я безуспешно пытался отладить его в течение 2 полных дней, я попробовал то, что должен был сделать раньше.

Я пробовал этот конфиг на Linode, и он работает !!!

Так что, вероятно, проблема где-то в конфигурации Ubuntu ... Не знаю, где искать.

Придется поиграться с таймаутами сервера. Nginx закрывает соединение, поскольку считает, что оно завершено, и закрывает соединение без уведомления. Мне на ум приходят четыре директивы, которые могут помочь вам.

client_body_timeout (default is 65)
client_header_timeout (default is 65)
keepalive_timeout (default is 65)
send_timeout (default is 65)

Все значения указаны в секундах. Пожалуйста, сообщите, помогло ли что-либо из этого (лично я считаю, что он должен оставаться в живых, но, пожалуйста, проверьте).

Я думаю, что @ Fleshgrinder на правильном пути, но есть определенные параметры тайм-аута fastcgi, которые вы должны проверить, как указано в nginx документация fastcgi_module. В частности, я бы посмотрел на увеличение fastcgi_read_timeout со значения по умолчанию 60 секунд до 1000 и посмотрите, сортирует ли это.