dav-ext: NGINX WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK 支持
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7, 8, 9 和 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-dav-ext
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-dav-ext
通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:
load_module modules/ngx_http_dav_ext_module.so;
本文档描述了 nginx-module-dav-ext v3.0.0,于 2018 年 12 月 17 日发布。
nginx WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK 支持。
关于
标准的 ngx_http_dav_module 提供了部分 WebDAV 实现,仅支持 GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE 方法。
要在 nginx 中实现完整的 WebDAV 支持,您需要启用标准的 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 锁,指定名称和大小。还定义了锁的过期超时时间。默认锁超时时间为 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
与 MacOS 客户端兼容的带锁定的 WebDAV:
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;
}
}
}
GitHub
您可以在 nginx-module-dav-ext 的 GitHub 仓库中找到此模块的其他配置提示和文档。