Недавно возникла проблема с тайм-аутом загрузки файла, с которой сталкиваются многие пользователи моей системы. В основном, пользователи входят в систему загрузки в течение дня и отправляют файлы, обычно по 1-3 МБ каждый, обычно по 1-10 файлов. Когда пользователь загружает файл или пакет в течение определенного периода времени, загрузка файла для dropzone завершается с сообщением пользователю «Сервер ответил с кодом 0». Эта проблема возникает только иногда, но я могу легко воспроизвести проблему в любое время, если я попытаюсь загрузить большой файл (файлы), для загрузки которого требуется несколько минут. До сих пор я искал и пробовал много вещей, но проблема все еще возникает.
Если загрузка прошла успешно, файлы сохраняются в определенном месте на сервере, а информация о каждом файле сохраняется в базе данных.
Система построена с использованием Laravel PHP, Dropzone.js, Mysql и Apache. Ниже приведена некоторая информация о журналах ошибок, файлах конфигурации и вещах, которые я пробовал.
Вот что сообщают журналы ошибок laravel после сбоя загрузки:
[2014-10-02 15:52:26] log.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1429
Stack trace:
#0 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1050): Illuminate\Routing\Router->handleRoutingException(Object(Symfony\Component\Routing\Exception\ResourceNotFoundException))
#1 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1014): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))
#2 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(576): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#3 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(552): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))
#4 /usr/www/www.example.com/beta/public/index.php(49): Illuminate\Foundation\Application->run()
#5 {main} [] []
[2014-10-02 15:52:29] log.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' with message 'Controller method not found.' in /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Controllers/Controller.php:290
Stack trace:
#0 [internal function]: Illuminate\Routing\Controllers\Controller->missingMethod(Array)
#1 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Controllers/Controller.php(138): call_user_func_array(Array, Array)
#2 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Controllers/Controller.php(115): Illuminate\Routing\Controllers\Controller->callMethod('missingMethod', Array)
#3 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Router.php(985): Illuminate\Routing\Controllers\Controller->callAction(Object(Illuminate\Foundation\Application), Object(Illuminate\Routing\Router), 'missingMethod', Array)
#4 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}(Array)
#5 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Route.php(80): call_user_func_array(Object(Closure), Array)
#6 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Route.php(47): Illuminate\Routing\Route->callCallable()
#7 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1016): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request))
#8 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(576): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#9 /usr/www/www.example.com/beta/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(552): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))
#10 /usr/www/www.example.com/beta/public/index.php(49): Illuminate\Foundation\Application->run()
#11 {main} [] []
Вот некоторые настройки для Apache (httpd.conf):
KeepAlive On
MaxKeepAliveRequests 500
KeepAliveTimeout 5
ServerLimit 513
MaxClients 100
MaxRequestsPerChild 10000
Я изменил эти настройки по-разному, например, увеличил время ожидания / maxclients до 500, но результаты остались прежними. Загрузка не удалась в определенное время и, кажется, полностью игнорирует эти настройки.
Вот некоторые настройки в php.ini
default_socket_timeout = 500
mysql.connect_timeout = 500
max_execution_time = 1200
max_input_time = 1200
file_uploads = On
max_file_uploads = 50
post_max_size = 2047M
upload_max_filesize = 2047M
memory_limit = 258M
Вот файл laravel .htaccess
Options -Indexes
Я также попытался изменить код загрузки AJAX dropzone.js, добавив «xhr.timeout = 4000». При добавлении этой строки в dropzone.js загрузка будет частично загружена в индикатор выполнения, но затем она никогда не станет красной и не удастся. Загрузка будет просто вечно приостанавливаться, что заставляет меня думать, что проблема где-то на laravel или на сервере, но я не уверен в этом моменте. Без этой части кода мне кажется, что запрос AJAX в какое-то случайное время просто сбрасывается сервером / laravel, и загрузка файла завершается неудачно. Что еще более странно для меня, это то, что эта ошибка только недавно начала происходить. Система работала без сбоев и загружала файлы за несколько месяцев до этого.
Я был бы очень признателен за любой мозговой штурм, отзывы или помощь по этому вопросу.
Спасибо
ОБНОВИТЬ:
Я добавил эту строку в свой файл filters.php, чтобы узнать, что это за отсутствующий маршрут …
App::missing(function($exception)
{
Log::error('Missing URL was: ' . Request::fullUrl());
});
Мне удалось удалить все ошибки «NotFoundHTTPException …» и «Метод контроллера не найден …» из журналов ошибок Laravel. Тем не менее, загрузка файла по-прежнему не удается в случайное время, но теперь в журналах ошибок laravel нет сообщений об ошибках. Запрос на добавление ajax в Dropzone просто сбрасывается в случайное время и возвращает код состояния 0.
У кого-нибудь есть идеи о том, что мне следует попробовать, чтобы исправить это?
Ошибка ушла! Я смог отследить ошибку до старого модуля Apache, который запрашивал файл, который больше не существует. После проверки журналов ошибок, я заметил, что Apache получает сигнал на отключение каждую минуту, вызванный тем, что не найден файл, который требуется модулю. Я очень рад, что это наконец-то решено!
Других решений пока нет …