Nginx配置 WebDAV
WebDAV(Web-based Distributed Authoring and Versioning)是基于 HTTP/1.1 的增强协议。该协议使用户可以直接对 Web 服务器进行文件读写,并支持对文件的版本控制和写文件的加锁及解锁等操作。
Nginx 通过 ngx_http_dav_module 模块实现对 WebDAV 协议的支持,使用户通过 WebDAV 模块的配置指令实现文件的管理操作,该模块支持 WebDAV 协议的 PUT、DELETE、MKCOL、COPY 和 MOVE 请求方法,在配置编译参数时,需要添加 –with-http_dav_module 参数启用该功能。
ngx_http_dav_module 模块的配置指令如下表所示:
| 指令名称 | 指令值格式 | 默认值 | 指令说明 |
|---|---|---|---|
| create_full_put_path | on 或 off | off | 启用创建目录支持,默认情况下,Put 方法只能在已存在的目录里创建文件 |
| dav_access | users:permissions… | user:rw | 设置创建的文件及目录的访问权限,如果定义了 group 或 all 权限,user 设置可省略 |
| dav_methods | off 或 [PUT][DELETE][MKCOL][COPY][MOVE] | off | 指定支持的 WebDAV 方法 |
| min_delete_depth | number | 0 | 允许删除文件及目录的最小层级,小于该层级的文件及目录不允许删除 |
Nginx 的自有模块对 WebDAV 协议的支持并不完整,可以通过第三方模块 nginx-dav-ext-module 增加文件特性查找和对写文件的加锁与解锁支持。nginx-dav-ext-module 模块的配置指令如下表所示。
| 指令名称 | 指令值格式 | 默认值 | 指令说明 |
|---|---|---|---|
| dav_ext_methods | [PROPFIND][OPTIONS][LOCK][UNLOCK] | – | 指定支持的 WebDAV 方法 |
| dav_ext_lock_zone | zone=NAME:SIZE[timeout=TIMEOUT] | – | 定义存储文件锁的共享内存区域及锁超时时间,默认锁超时时间是 1 分钟 |
| dav_ext_lock | zone=NAME | – | 启用 WebDav 的锁操作支持 |
关于上表,有以下几点需要说明。
- dav_ext_lock_zone 指令只能编写在 http 指令域中;
- dav_methods 和 dav_ext_lock 指令可编写在 http、server、location 指令域中;
- WebDAV 协议方法及方法说明如下表所示。
| 方法名称 | 文件权限 | 方法说明 |
|---|---|---|
| OPTIONS | – | 支持 WebDAV 的检索服务方法 |
| GET | 读 | 获取文件 |
| PUT、POST | 写 | 上传文件 |
| DELETE | 删除 | 删除文件或集合 |
| COPY | 读、写 | 复制文件 |
| MOVE | 删除、写 | 移动文件 |
| MKCOL | 写 | 创建由一个或多个文件 URI 组成的新集合 |
| PROPFIND | 读 | 获取一个或多个文件的特性(创建日期、文件作者等),实现文件的查找与管理 |
| LOCK、UNLOCK | 写 | 添加、删除文件锁,实现写操作保护 |
进行 WebDAV 协议的 MOVE/COPY 操作时,会通过 HTTP 请求头属性字段 Destination 指定目标路径,如果客户端请求头中没有字段 Destination,Nginx 会直接报错。为增加服务端兼容性,可以通过第三方模块 headers-more-nginx-module 的 more_set_input_headers 指令在 MOVE/COPY 操作的 HTTP 请求头中强制添加 Destination 字段。
配置WebDAV
- 依赖
git clone https://github.com/arut/nginx-dav-ext-module.git
- 编译安装
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-http_dav_module --with-http_v2_module --with-http_v3_module --add-module=../nginx-dav-ext-module/ --with-http_geoip_module --add-module=/usr/local/nginx/ngx_http_geoip2_module --with-http_realip_module
- 生成auth 账密
htpasswd -c /usr/local/nginx/auth/.htpasswd USERNAME
- vhost 配置
# dav_ext_lock_zone zone=davlock:10m; # DAV文件锁内存共享区
server {
listen 80;
server_name dav.xp.sb;
root /data/wwwroot/dav;
location / {
auth_basic "Authenticated Users";
auth_basic_user_file /usr/local/nginx/auth/.htpasswd;
root /data/wwwroot/dav/;
create_full_put_path on; # 启用创建目录支持
dav_methods PUT DELETE MKCOL COPY MOVE; # DAV支持的请求方法
dav_ext_methods PROPFIND OPTIONS; # DAV扩展支持的请求方法
# dav_access user:rw group:r all:r; # 设置创建的文件及目录的访问权限
# dav_ext_lock zone=davlock; # DAV扩展锁绑定的内存区域
#为各种方法的URI后加上斜杠,解决各平台webdav客户端的兼容性问题
set $dest $http_destination;
if (-d $request_filename) { # 对目录请求、对URI自动添加"/"
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
if ($request_method ~ (MOVE|COPY)) { # 对MOVE|COPY方法强制添加Destination请求头
more_set_input_headers 'Destination: $dest';
}
if ($request_method ~ MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
error_page 401 /401.html;
error_page 403 /403.html;
error_page 404 /404.html;
location = /401.html {
root /data/wwwroot/dav;
}
location = /403.html {
root /data/wwwroot/dav;
}
location = /404.html {
root /data/wwwroot/dav;
}
access_log /data/wwwlogs/webdav.log json;
}
}