Модуль ngx_http_dav_module
Модуль ngx_http_dav_module предназначен для автоматизации задач управления файлами на сервере по протоколу WebDAV. Модуль обрабатывает HTTP- и WebDAV-методы PUT, DELETE, MKCOL, COPY и MOVE.
По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_dav_module .
WebDAV-клиенты, которые требуют для работы дополнительных WebDAV-методов, не будут работать с этим модулем.
Пример конфигурации
Директивы
Синтаксис: | create_full_put_path on | off ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
По спецификации WebDAV-метод PUT может создавать файл только в уже существующем каталоге. Данная директива разрешает создавать все необходимые промежуточные каталоги.
Синтаксис: | dav_access пользователи : права . ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
Задаёт права доступа для создаваемых файлов и каталогов, например,
Если заданы какие-либо права для group или all , то права для user указывать необязательно:
Синтаксис: | dav_methods off | метод . ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
Разрешает указанные HTTP- и WebDAV-методы. Параметр off запрещает все методы, обрабатываемые данным модулем. Поддерживаются следующие методы: PUT , DELETE , MKCOL , COPY и MOVE .
Файл, загружаемый методом PUT, записывается во временный файл, а потом этот файл переименовывается. Начиная с версии 0.8.9 временный файл и его постоянное место хранения могут располагаться на разных файловых системах. Однако нужно учитывать, что в этом случае вместо дешёвой операции переименовывания в пределах одной файловой системы файл копируется с одной файловой системы на другую. Поэтому лучше, если сохраняемые файлы будут находиться на той же файловой системе, что и каталог с временными файлами, задаваемый директивой client_body_temp_path для данного location.
При создании файла с помощью метода PUT можно задать дату модификации, передав её в поле заголовка “Date”.
Синтаксис: | min_delete_depth число ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
Разрешает методу DELETE удалять файлы при условии, что число элементов в пути запроса не меньше заданного. Например, директива
Источник
WebDav и Nginx
Приветствую вас, господа.
Не так давно в одном из своих проектов мне понадобилось иметь возможность передачи файлов посредством метода PUT, без скрипта-обработчика на принимающей стороне, принять и обработать файл должен был сам сервер. Так же была задача реализовать это не на Apache, а на его собрате — Nginx.
В итоге своих изысканий у меня получилась такая схема — скрипт на PHP получает адрес файла и делает запрос к серверу, а он в свою очередь получает файл и складывает в требуемую папочку.
Приводить дальнейшие примеры по установке, настройке и отработке взаимодействий я буду отталкиваясь от debian-based ОС.
Сторона сервера, Nginx
Скачиваем, компилируем и устанавливаем сервер с требуемым модулем:
wget nginx.org/download/nginx-1.1.1.tar.gz
tar -xvf nginx-1.1.1.tar.gz
cd nginx-1.1.1
./configure —sbin-path=/usr/sbin —conf-path=/etc/nginx/nginx.conf \
—error-log-path=/var/log/nginx/error.log \
—pid-path=/var/run/nginx.pid \
—lock-path=/var/lock/nginx.lock \
—http-log-path=/var/log/nginx/access.log \
—http-client-body-temp-path=/var/lib/nginx/body \
—http-proxy-temp-path=/var/lib/nginx/proxy \
—http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
—with-http_stub_status_module \
—with-http_ssl_module \
—with-http_dav_module
make && make install
Настраиваем конфигурацию:
При компиляции мы указали что конфигурационный файл будет лежать в /etc/nginx/nginx.conf
Прописываем новую секцию server, так как надо чтобы webdav работал на другом порту — так, и безопасней, и удобней.
server <
listen 7500; #порт на котором будет слушать nginx
server_name ip-адрес-сервера;
charset utf-8;
location / <
expires max;
root /путь/до/требуемой/папки; #по этому пути будут складываться полученный PUT’ом файлы
client_max_body_size 20m;
client_body_temp_path /usr/local/nginx/html/;
dav_methods PUT; #разрешенные методы, нам требуется только PUT
create_full_put_path on; #при отсутствии вложенных папок, при включенной директиве, nginx автоматически создаст иерархию
dav_access user:rw group:r all:r; #права на файлы
Хочу так же заметить что с настроенным модулем так же отрабатывают и остальные директивы WebDav указанные в конфигурационном файле Nginx: DELETE, MKCOL, COPY, MOVE.
Сторона «клиента», второго сервера, PHP-скрипт
Оговорим что в переменной $namefile уже содержится имя файла вида file.zip полученное тем или иным способом.
$url = «ip-адрес-сервера:7500/$namefile»;
$file = «/files/$namefile»;
$fp = fopen($file, «r»);
$curl = curl_init();
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PUT, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_INFILE, $fp);
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($file));
Теперь, когда все установлено и настроено, мы можем обратиться к скрипту, передать путь до файла и скрипт передаст наш файл серверу, который в свою очередь без PHP, Perl или написанного на другом языке обработчика сможет принять и разместить файл на другом сервере.
Надеюсь что написанный текст был вам интересен, за сим откланяюсь.
Источник
Про Debian
Иногда возникает необходимость заливать файлики на второй сервер и отдавать их оттуда же по http(s). Ну навскидку — отдельные серверы с картинками для вашего проекта. Или с архивами. Да с чем угодно, мне-то какая разница =)
Поднимать ради этого ftp и городить работы с ftp в коде сайта? гм… SFTP… можно, но где взять разработчика, который умеет sftp из php? Джангисты и рельсовики все умеют, ладно. А если nodejs?
А вот curl/libcurl есть везде, PUT/POST запросы можно сделать из любого ЯП/фреймворка. Поэтому приходят 2 логичных решения — либо написать php-код на принимающей стороне, который будет принимать файлы, либо сделать всё это на голом nginx-e. Окей, решили вторым способом, пришли на тостер, спросили… И получили какой-то бред в ответе — https://toster.ru/q/46578
upload-module? big-upload-module? clientbodyonthefly ещё куда ни шло, это всё же штатная фича..
Да к черту. Открываем доку (окей, в моём случае — задаём вопрос в воздух и получаем ответ от соседа-админа) по nginx и листаем до пункта «http webdav module». Всё, можно заливать файлы (ладно-ладно, конфиг я вам покажу). И решаем сразу все проблемы: нужен только дефолтный nginx из репозиториев debian/ubuntu, размер файла ограничен только стабильностью соединения (13 гиговый файл? да легко!), конфиг писать легко (копипастинг работает, да), авторизация рулится через привычный htpasswd.. В общем — быть. Погнали
Допустим nginx у нас уже есть и что-то по http куда-то отвечает. Нам нужно на images.example.com настроить upload файлов через webdav (и научиться заливать файлы курлом) с авторизацией и научиться показывать эти файлы по http без авторизации. Создаём каталог, где будем всё это хранить, например:
# mkdir /home/user/data/www/images.example.com
Nginx из коробки работает от пользователя www-data (я про деб, в других дистрах это может быть www), от него же он будет и файлы писать, так что пофиксим права:
# chown -R www-data:www-data /home/user/data/www/images.example.com
Теперь пишем конфиг (например, в /etc/nginx/sites-available/00-images.example.com):
# touch /etc/nginx/htpasswd; chmod 600 /etc/nginx/htpasswd
Сгенерим пользователя (если у вас нет утилиты htpasswd, то поставьте пакет apache2-utils — apache2 этот пакет не ставит, если что =)) — команду повторите нужное количество раз, заменяя username, при запуске она запросит пароль для пользователя:
# htpasswd -nm username >> /etc/nginx/htpasswd
Рестартим nginx, если ещё нет и приступаем к заливанию файлов. Я покажу это на примере консольного curl, с libcurl, думаю, разберетесь сами, если уже дочитали до сюда.
Например, у нас есть файл /tmp/bigfile. Нам его нужно будет показывать по адресу http://images.example.com/archives/bigfile.zip
Запускаем curl с хитрыми параметрами:
$ curl -T /tmp/bigfile http://username:password@images.example.com/upload/archives/bigfile.zip
Имейте в виду, что пока файл льётся, он льётся в каталог /var/lib/nginx/body/. Когда upload закончится, файл будет перемещен в docroot через mv — так что если у вас /var и каталог для upload на разных файловых системах, то операция будет не атомарной. Если же на одной файловой системе — то файл появится в docroot мнгновенно и целиком (то есть не будет такого, что вы заливаете файл, а в это время его кусок могут скачать другие).
В некоторых местах вы можете услышать мнение, что передавать логин/пароль так, как это сделал я выше небезопасно и нужно обязательно передавать basic-авторизацию через http-заголовок Authorization, потому что так безопаснее. Так вот — не слушайте потом больше никогда этого человека. Заголовок Authorization это всего-лишь base64 (хоть и немного нестандартный) и декодится по первой же ссылке в гугле — https://webnet77.net/cgi-bin/helpers/base-64.pl
Намного лучше будет настроить https (https://debian.pro/581) и настроить ограничение по ip (https://debian.pro/726). Впрочем, если вам удобнее передавать через заголовок — welcome, но не тешьте себя надеждой, что это позволит избежать раскрытие пароля, если к исходникам заливалки получат доступ.
Да, ещё с этим модулем nginx’a не будут работать webdav-клиенты — уж очень он простой (в нём даже нет вебдавного листинга файлов/каталогов). Если вам нужен настоящий webdav — то советую посмотреть в сторону установки OwnCloud.
Источник
xandroskin blog | it or not it
В предыдущей статье, посвященной данной теме, было описано, как завести у себя небольшой WebDAV сервер на Apache. Набирающий популярность веб-сервер nginx также также подходит для этих задач. Его модуль ngx_http_dav_module поддерживает основные WebDAV-методы PUT, DELETE, MKCOL, COPY и MOVE, а с помощью дополнения nginx-dav-ext-module можно включить поддержку остальных (PROPFIND и OPTIONS).
- Для начала необходимо скачать исходные пакеты nginx с официального сайта. Если требуется дополнительный функционал, стягиваем репозиторий
- Во время сборки nginx указываем путь до дополнительного модуля с помощью опции —add-module=/путь/до/папки , а также включаем в параметры опцию —with-http_dav_module
- После успешной установки веб-сервера переходим к настройке. Выбираем директорию, которую хотим выделить под управление по сети. Проверяем доступность для пользователя, под которым работает nginx (см. его настройки)
- Создаем пару логин+пароль для авторизации на нашем сервере. Авторизация по протоколу HTTP Basic Authentication в nginx предоставляется с помощью модуля ngx_http_auth_basic_module, который включен по умолчанию. Генерируем хэш пароля с помощью утилиты из набора apache-utils htpasswd или любым онлайн генератором файлов .htpasswd.
- В файле конфигураций nginx создаем location, в котором будет содержаться описание работы с этой директорией. О доступных в рамках этого модуля директивах можно найти информацию в официальной документации. Пример настройки:
- Перезапустив nginx проверяем доступность каталога по сети с помощью браузера или любого удобного WebDAV-клиента
Note: Есть 2 версии nginx-dav-ext-module. При работе с модулем из первого репозитория была выявлена проблема: Nautilus некорректно отображает кириллические имена файлов (преобразует их в urlencode, в результате чего вместо «Фильмы» папка называется «%d0%a4%d0%b8%d0%bb%d1%8c%d0%bc%d1%8b»). Позже был найден форк репозитория с фиксом этой проблемы. В статье указан последний репозиторий.
Источник
NGINX WebDav Module
While setting up a website you can face the need to build some complicated method of viewing and updating the information on the site. There are lots of solutions — using a local copy, using a combination of HTTP and FTP tools to download the original and upload the changes etc. But also as an easy solution you can use Web-based Distributed Authoring and Versioning (WebDAV) which is available in Jelastic.
WebDAV is turning into an important tool which was invented in order to simplify the way you update websites.
Enabling WebDAV module for NGINX server
Click Config button for the server in your environment.
In the /etc/nginxВ folder open theВ nginx.conf file. Modify configuration by adding the following strings as it is shown in the picture below:
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
Save the changes and restart NGINX. Using nginx.conf file you can set any other configurations for WebDav module. Follow the link (http://wiki.nginx.org/HttpDavModule) to find some additional useful information.
Setting up security configuration
Generate hash from your password. For that you can use any htpasswd tool or online service (for example, http://www.htpasswdgenerator.net/).
Create simple text file with previously generated hash.
Click Config button for your NGINX server.
Upload the created file to the /var/www/webroot/ROOTВ folder.
In the /etc/nginxВ folder open theВ nginx.conf file. Add the following strings:
auth_basic “Restricted area”;
auth_basic_user_file /var/www/webroot/ROOT/.htpasswd;
Save the changes and restart NGINX.
Finally you can go to any WebDAV client. State there the host (also your credentials if you set up security configuration) and connect to the server. As a result you’ll see your files and will be able to edit them, update, add some new files etc.
Источник