Nginx 504 Тайм-аут при архивировании / распаковке и перемещении файлов
Мы получаем 504 тайм-аута в Wordpress с функцией, которую мы прикрепили к "публикации публикации", которая берет атакованный zip-файл, распаковывает его, перемещает разархивированные файлы в s3, создает новый Zip и также перемещает его в S3. На больших файлах его время истекает через 60 секунд.
Могу ли я прояснить здесь и сейчас эту ISNT пользовательскую функцию - этого не происходит с внешнего интерфейса сайта, когда пользователь что-то делает. Пользователь загружает изображения контента, zip и т. Д. В сообщение, которое ждет нас в панели администратора. После модерации мы можем выбрать удаление поста (который удаляет все данные, которые они загрузили одновременно) или публикацию поста, который затем берет загруженный почтовый индекс, распаковывает его, проверяет на вирусы, удаляет все, что не является MP3, загружает отдельные файлы MP3 на S3, создает новый zip-файл и также загружает его на S3. Это все работает с EC2. Как вы можете себе представить, несмотря на то, что это не слишком сильно загружает ЦП сервера, для перемещения всех этих данных на S3 часто требуется больше 60 секунд.
Итак, я видел предложения о том, как предотвратить тайм-аут шлюза с Nginx
Я поместил fastcgi_read_timeout в свой nginx.conf и установил его (на данный момент) на 2700, чтобы избежать всех ошибок времени ожидания. Я сделал это со всем, что связано с таймаутами. Я также добавил client_body_timeout и send_timeout, как упомянуто на этой странице. Но все равно время ожидания истекает через 60 секунд.
Возможно, я помещаю их в неправильное место на nginx.conf (он перезапускается без проблем), используя неправильное время, или, возможно, есть другая функция, которая позволит завершить этот процесс php.
У меня есть все времена php-fpm, если я могу установить их тоже.
1 ответ
HTTP-запросы не могут жить вечно - либо сервер, либо клиент в конечном итоге сдадутся (самые большие тайм-ауты на стороне сервера для HTTP-запросов обычно составляют 5-10 минут, а пользователи часто сдаются раньше и начинают стучать по кнопке перезагрузки). практически гарантированный способ убить ваш сервер).
Как сказал Майкл Хэмптон, вам необходимо изменить дизайн приложения, чтобы учесть тот факт, что у вас есть этап фоновой обработки, который может занять много времени.
Небольшой AJAX проходит долгий путь (в то время как серверная часть обрабатывает, клиент может периодически запрашивать обновления состояния с сервера - это позволяет вам предоставлять обратную связь с пользователем о ходе работы и избегать всей проблемы тайм-аута).
Есть много других способов справиться с этим тоже.