Перейти к содержанию

dav-ext: Поддержка NGINX WebDAV PROPFIND, OPTIONS, LOCK, UNLOCK

Установка Debian/Ubuntu

Эти документы относятся к пакету APT nginx-module-dav-ext, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT-репозиторий, как описано в настройке APT репозитория.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-dav-ext
Показать дистрибутивы и архитектуры
| Distro   | Suite             | Component   | Architectures   |
|----------|-------------------|-------------|-----------------|
| debian   | bookworm          | main        | amd64, arm64    |
| debian   | bookworm-mainline | main        | amd64, arm64    |
| debian   | trixie            | main        | amd64, arm64    |
| debian   | trixie-mainline   | main        | amd64, arm64    |
| ubuntu   | focal             | main        | amd64, arm64    |
| ubuntu   | focal-mainline    | main        | amd64, arm64    |
| ubuntu   | jammy             | main        | amd64, arm64    |
| ubuntu   | jammy-mainline    | main        | amd64, arm64    |
| ubuntu   | noble             | main        | amd64, arm64    |
| ubuntu   | noble-mainline    | main        | amd64, arm64    |

nginx WebDAV поддержка PROPFIND, OPTIONS, LOCK, UNLOCK.

Описание

Стандартный ngx_http_dav_module предоставляет частичную реализацию WebDAV и поддерживает только методы GET, HEAD, PUT, DELETE, MKCOL, COPY, MOVE.

Для полной поддержки WebDAV в nginx вам необходимо включить стандартный ngx_http_dav_module, а также этот модуль для отсутствующих методов.

Тестирование

Тесты модуля требуют стандартные nginx-tests и библиотеку Perl HTTP::DAV.

$ export PERL5LIB=/path/to/nginx-tests/lib
$ export TEST_NGINX_BINARY=/path/to/nginx
$ prove t

Блокировка

  • Поддерживаются только эксклюзивные блокировки на запись, что является единственным типом блокировок, описанным в спецификации WebDAV.
  • Все текущие блокировки хранятся в списке. Проверка, ограничен ли объект блокировкой, требует O(n) операций. Огромное количество одновременно хранимых блокировок может снизить производительность. Поэтому не рекомендуется устанавливать большой тайм-аут блокировки, который увеличивает количество блокировок.

Директивы

dav_ext_methods

Синтаксис: dav_ext_methods [PROPFIND] [OPTIONS] [LOCK] [UNLOCK]
Контекст: http, server, location

Включает поддержку указанных методов WebDAV в текущем контексте.

dav_ext_lock_zone

Синтаксис: dav_ext_lock_zone zone=NAME:SIZE [timeout=TIMEOUT]
Контекст: http

Определяет общую зону для блокировок WebDAV с указанными ИМЕНЕМ и РАЗМЕРОМ. Также определяет время истечения блокировки TIMEOUT. Значение по умолчанию для тайм-аута блокировки – 1 минута.

dav_ext_lock

Синтаксис: dav_ext_lock zone=NAME
Контекст: http, server, location

Включает блокировку WebDAV в указанном контексте. Блокировки хранятся в общей зоне, указанной ИМЕНЕМ. Эта зона должна быть определена с директивой dav_ext_lock_zone.

Обратите внимание, что хотя эта директива включает возможности блокировки в текущем контексте, HTTP методы LOCK и UNLOCK также должны быть явно указаны в dav_ext_methods.

Пример 1

Простой пример без блокировки:

location / {
    root /data/www;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
}

Пример 2

WebDAV с блокировкой:

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}

Пример 3

WebDAV с блокировкой, который работает с клиентом MacOS:

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            # включить создание директорий без конечного слэша
            set $x $uri$request_method;
            if ($x ~ [^/]MKCOL$) {
                rewrite ^(.*)$ $1/;
            }

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}