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 或 PUTMKCOL[MOVE] | off | 指定支持的 WebDAV 方法 |
min_delete_depth | number | 0 | 允许删除文件及目录的最小层级,小于该层级的文件及目录不允许删除 |
Nginx 的自有模块对 WebDAV 协议的支持并不完整,可以通过第三方模块 nginx-dav-ext-module 增加文件特性查找和对写文件的加锁与解锁支持。nginx-dav-ext-module 模块的配置指令如下表所示。
指令名称 | 指令值格式 | 默认值 | 指令说明 |
---|---|---|---|
dav_ext_methods | PROPFINDLOCK | -- | 指定支持的 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; } }