Nginx 1.5+ загрузка файлов - лучшие практики
Я хочу загрузить файлы через мой сервер nginx
. В настоящее время я запускаю nginx-1.4.6
и желаю перейти к последней стабильной nginx-1.5*
по мере необходимости.
Любимым сообществом является Валерий Холодков nginx-upload-module
, найденный здесь. К сожалению, Валерий больше не поддерживает этот модуль, подробности здесь. Начиная с nginx-1.3.9
модуль работает частично или вообще не работает.
Я скомпилировал nginx-upload-module
в nginx-1.4.6
и получил ошибку (Client cxn closed), которая кажется исправленной в nginx-1.5.3
ревизии. Однако я применил патч и не повезло.
Анатолий слегка устарел, здесь, предлагает несколько решений, включает в себя четыре решения
Когда я погружаюсь во второе и четвертое решения (я предпочитаю не устанавливать lua
зависимость, но я могу), я подумал, что уместно спросить это сообщество:
Каковы текущие рекомендации по загрузке файлов с помощью nginx-1.5+
?
Добавлю, что я загружаю файлы из команды python
POST
и пытаюсь протестировать с помощью curl
. PHP
не входит в мой технический стек.
Ответы
Ответ 1
Возможно, вы можете использовать perl, если вам не нравятся php или lua.
http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods
$r- > has_request_body (обработчик)
Но из коробки nginx не является инструментом для сохранения полученного почтового запроса и его сохранения.
Возможно, uWSGI (https://uwsgi-docs.readthedocs.io/en/latest/) - лучший способ пойти с http-socket https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html и приложение python.
Ответ 2
Там хорошая статья о твоих сомнениях. https://coderwall.com/p/swgfvw
Я попробовал nginx-upload-module. Это хорошее решение, но, похоже, это не работает для новых версий.
Там также есть некоторые модули в Lua, которые могут вам помочь. В моем случае у меня была логика логичности, которую я реализовал в своем приложении.
Имейте в виду, что большой проблемой для загрузки файлов является FILER. Это ботленка: много испытаний на нагрузку, которые я сделал, показали мне этот вывод.
Ответ 3
Nginx поддерживает метод POST, где вы можете использовать большие параметры. Клиент может использовать php или jsp для использования метода post для создания запроса на сервер nginx.
Ответ 4
Я понимаю, что это очень старый вопрос, но он на первой странице поиска Google для "модуля загрузки nginx", и это первый результат, поэтому в случае, если это поможет кому-то еще, сталкивающемуся с этим вопросом:
Я использую модуль nginx-upload для nginx 1.10.3. Как упоминается в первоначальном вопросе, Валерий Холодков больше не поддерживает модуль. Однако есть несколько разных вилок, и другие люди модифицировали его для работы с новыми версиями nginx.
Этот запрос на перенос - это то, что я использовал для компиляции nginx с модулем загрузки.
https://github.com/vkholodkov/nginx-upload-module/pull/88
Модуль загрузки, IMO, по-прежнему остается лучшим решением, если вы используете nginx и php-fpm. Этот модуль позволяет полностью загружать загружаемые файлы nginx до тех пор, пока они не будут завершены, а затем выполнение обработки загрузки будет передано на PHP. Таким образом, процессы php-fpm не будут создавать узкое место, когда ваши пользователи загружают много файлов.
Ответ 5
Просто быстрый проект, но попробуйте это...
Upload.php
if (isset($_FILES['dlc_file']) && !empty($_FILES['dlc_file'])) {
if (empty($_FILES['dlc_file']['name']) === true) {
echo = "Please choose a file to upload";
} else {
$allowed = array('zip', 'rar', 'gzip', 'tar', '7z', 'png', 'jpg');
$file_name = $_FILES['dlc_file']['name'];
$file_extn = strtolower(end(explode('.', $file_name)));
$file_temp = $_FILES['dlc_file']['tmp_name'];
if (in_array($file_extn, $allowed) === true) {
$file_path = 'dlc/' . substr(md5(time()), 0, 10) . '.' . $file_extn;
move_uploaded_file($file_temp, $file_path);
echo = "Successfully uploaded $file_name";
} else {
$file_types = implode(', ', $allowed);
echo "File type is not allowed, Allowed file types $file_types";
}
}
}
index.php
<form action="upload.php" method="post" enctype="multipart/form-data>
<input type="file" name="dlc_file">
<input type="submit" name="submit" value="Upload">
</form>