Загадочная ошибка 503 при синхронизации файлов PHP/MySQL/базы данных

Я надеюсь, что вы все можете мне немного помочь. Я потратил около 7 часов, пытаясь найти ответ, и до сих пор пробовал много вещей.

У меня есть PHP-скрипт, который используется для синхронизации файлов/данных базы данных между двумя серверами. Прежде чем вы, ребята, спросите, этот процесс необходим для этого проекта и должен оставаться на месте.

Сценарий в основном находит все файлы в каталоге, которые были изменены за последние 72 часа, и отправляет их по SFTP на другой сервер, заменяя все необходимые файлы. Затем он создает копию резервной базы данных, удаляет определенные таблицы/строки, изменяет другие и экспортирует файл .sql. Затем он передает этот файл .sql по SFTP на другой сервер и вызывает включение файла на втором сервере, который импортирует файл .sql, заменяя существующую базу данных обновленными данными.

Все это работает...

Проблема в том, что независимо от того, какие изменения я вношу в конфигурацию Apache, сценарий всегда выдает мне ошибку 503 через 30 секунд каждый раз (точнее, между 30,02 и 30,04 секундами). Однако PHP-скрипт продолжает работать и успешно завершает все операции, включая запись в лог-файл, примерно за 60-61 секунду. В журналах Apache также нет никаких ссылок на какие-либо ошибки.

Я проверил все используемые файлы .conf, и ни в одном из них не упоминается 30-секундный тайм-аут. В моем httpd.conf я добавил следующие строки:

TimeOut 300
ProxyTimeOut 300
KeepAlive On
KeepAliveTimeout 60

Я также установил max_execution_time и memory_limit в php-скрипте на 120 и 2048M соответственно, чтобы исключить это во время тестирования.

Страница должна отображать сообщение об успешном завершении для пользователя с отчетом о том, что было изменено/обновлено. Однако с ошибкой 503 я не могу этого сделать. Поэтому я хочу избавиться от этого ограничения 503, чтобы он мог правильно отображать конечный результат синхронизации. Если честно, я не слишком знаком с конфигурацией Apache, поэтому любая помощь/идеи о том, что может вызвать это/где искать, будут очень оценены!

Заранее спасибо!


person MelArlo    schedule 17.02.2016    source источник


Ответы (2)


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

Короче говоря, вот ответ для будущих посетителей:

Для последних версий httpd и mod_proxy_fcgi вы можете просто добавить timeout= в конец строки ProxyPassMatch, например:

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

Для более старых версий это было немного сложнее, например:

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1
person MelArlo    schedule 17.02.2016

Не уверен, пробовали ли вы это, но я думаю, вам может понадобиться настроить max_execution_time в php.ini, который использует Apache. Во многих дистрибутивах по умолчанию установлено значение 30.

http://php.net/manual/en/info.configuration.php#ini.max-execution-time

person bigmandan    schedule 17.02.2016
comment
Спасибо за идею @bigmandan, однако я уже установил это значение на 120. Для завершения сценария требуется чуть более 60, так что это не должно быть проблемой. - person MelArlo; 17.02.2016