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; #права на файлы

limit_except GET {
allow all;
}
}
}


Хочу так же заметить что с настроенным модулем так же отрабатывают и остальные директивы 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));

curl_close($curl);
fclose($fp);


Итог


Теперь, когда все установлено и настроено, мы можем обратиться к скрипту, передать путь до файла и скрипт передаст наш файл серверу, который в свою очередь без PHP, Perl или написанного на другом языке обработчика сможет принять и разместить файл на другом сервере.

Надеюсь что написанный текст был вам интересен, за сим откланяюсь.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 9

    0
    Статья пустая.
    Почему другой порт удобней и безопасней?
    Зачем отдельный пхп скрипт — почему сам браузер не заставить webdav юзать?
    А надо ли «другие» методы кроме PUT — и если нет, как их закрыть?
    А какой вообще use-case у всех телодвижений?
      +1
      возможно браузера в цепочке и нет, может это сторедж какой-нибудь?
        +1
        Вы это понимаете, я это понимаю. Но из статьи это не вытекает — статья вообще только про один-единственный ключик для сборки nginx'а и один option для curl'а.
        Огромный пласт остаётся вне поля зрения — начиная с secuity этого решения и заканчивая вообще целью — а то может мне это нужно, а я и не знаю? И не узнаю, из такой статьи.
        0
        Логично же — про другой порт вряд ли узнает кто то еще кроме тебя самого. А так же используя отдельный порт в скриптах при обращении ты четко идентифицируешь, то с чем работаешь.

        В смысле «зачем отдельный скрипт»? Такова задача, изначально чтобы на сервере «клиенте» прежде чем отослать запрос и файл требуется ряд телодвижений. Так же не факт что PHP скрипт инициализируется браузером. Может быть отработка по крону, etc.

        Прочтите статью внимательней, в конфигурационном файле указано что
        «dav_methods PUT; #разрешенные методы, нам требуется только PUT». Соответственно если нам нужен\не нужен другой метод то мы используем директиву dav_methods.

        Я привел пример настройки WebDav на nginx как альтернативу WebDav на apache. Учитывая что информации по подобной конфигурации в сети очень мало, то думаю что разные вариации использования такой схемы — найдут себе применение.
          +1
          > Логично же — про другой порт вряд ли узнает кто то еще кроме тебя самого.
          Портов всего 65к, и при исследовании любого сервера первое действие — скан портов на тему «а где что висит».

          В прямом — задача врядли стояла «сделайте возмонжость передать файл через PUT без использования PHP скрипта на том сервере». Задача решалась всё-таки какая-то другая. Какая? Почему решалась именно через WebDAV, а не FTP, например? Тот же CURL прекрасно загружает файлы и по FTP.
            +1
            Можно долго разглагольствовать на тему безопасности, я всего лишь сделал маленький шаг для защиты от дурака. Естественно тот же nmap быстро все вам расскажет.

            Антон, вы не поверите, но задача стояла прямо так как вы и произнесли. PUT без PHP обработчика на принимающей стороне. Зачем на принимающем сервере ради передачи файлов поднимать PHP? Nginx прекрасно справляется с задачей тратя значительно меньше ресурсов чем apache.

            FTP не для этого создан был. А PUT идеально подходит для этой задачи так как не имеет ограничения по длине запроса в отличии от других методов. (GET, POST)
              0
              Хм. Если задача стояла прямо так — то можно узнать в рамках какой более общей задачи она появилась? Для общего образования.
                +1
                Два сервера, продакшен на котором проект и CDN. При загрузке фотографий, файлов пользователями, etc, все это загруженное дело скидывается PUT'ом на файлопомойку дабы не терроризировать продакшен сервер отдачей статики.
        0
        1. Зачем делать из Debian'а помойку make'ом?
        2. http_dav_module даже в 0.6.32 есть, зачем его перекомпиливать?

        Only users with full accounts can post comments. Log in, please.