alex5e
@alex5e

Почему apache + nginx при обработке изображений отдает 500 ошибку?

Есть php скрипт, который выполняет обработку большого количества изображений (ресайз, наложение вотермарков и тд.). Проблема в том, что скрипт по истечению 40 минут работы отдает 500 ошибку, а затем, с каждым последующим запуском отваливается еще раньше, хотя таймаут на выполнение запроса стоит около часа. В логи пишет upstream prematurely closed connection while reading response header from upstream

У Apache
max_execution_time 3600
max_input_time 3600
upload_max_filesize 512M
post_max_size 512M
memory_limit 512M

У nginx
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
proxy_buffer_size 512k;
proxy_buffers 512 4096k;
proxy_busy_buffers_size 4096k;
proxy_temp_file_write_size 4096k;
client_max_body_size 30m;
client_body_buffer_size 4096k;
large_client_header_buffers 8 32k;

В самом скрипте после обработки каждого каталога очищается дисковый кэш
Как можно решить данную проблему, не прибегая к крону и/или запуску скрипта непосредственно на сервере?
  • Вопрос задан
  • 4268 просмотров
Решения вопроса 1
valerium
@valerium
Изобретая велосипед
Запись в логах nginx «upstream prematurely closed connection while reading response header from upstream» означает именно преждевременное закрытие соединение проксируемого сервера, то есть ошибку в ходе выполнения скрипта. Смотрите логи самого скрипта или апача. Либо скрипту не хватает ресурсов, либо каких-то библиотек/модулей, либо в самом коде содержатся ошибки.

Кстати, код состояния 500 (Internal server error) как бы намекает на ошибку. Если проксируемый сервер не отвечает слишком долго, возвращается код состояния 504 (Gateway timeout).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
MetaDone
@MetaDone
Хорошо сформулированный вопрос - 50% решения
вообще для таких ресурсоемких задач, время выполнения которых непредсказуемо, желательно использовать очереди. Очень простой сервер очередей - gearman.org
еще материал здесь habrahabr.ru/post/142210
php.net/manual/ru/book.gearman.php
ну или можно навесить костыль вида
FcgidMaxRequestLen 512000000
<IfModule mod_fcgid.c>
    FcgidBusyTimeout 3600
    FcgidIOTimeout   3600
</IfModule>
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Для подобных задач есть php-cli.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы