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_pathon 或 offoff启用创建目录支持,默认情况下,Put 方法只能在已存在的目录里创建文件
dav_accessusers:permissions...user:rw设置创建的文件及目录的访问权限,如果定义了 group 或 all 权限,user 设置可省略
dav_methodsoff 或 PUTMKCOL[MOVE]off指定支持的 WebDAV 方法
min_delete_depthnumber0允许删除文件及目录的最小层级,小于该层级的文件及目录不允许删除

Nginx 的自有模块对 WebDAV 协议的支持并不完整,可以通过第三方模块 nginx-dav-ext-module 增加文件特性查找和对写文件的加锁与解锁支持。nginx-dav-ext-module 模块的配置指令如下表所示。

指令名称指令值格式默认值指令说明
dav_ext_methodsPROPFINDLOCK--指定支持的 WebDAV 方法
dav_ext_lock_zonezone=NAME:SIZE[timeout=TIMEOUT]--定义存储文件锁的共享内存区域及锁超时时间,默认锁超时时间是 1 分钟
dav_ext_lockzone=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

  1. 依赖

    git clone https://github.com/arut/nginx-dav-ext-module.git
  2. 编译安装

    ./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
  3. 生成auth 账密

    htpasswd -c  /usr/local/nginx/auth/.htpasswd USERNAME
  4. 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;
    }
    }
                                                      

标签: nginx, openresty, WebDAV

添加新评论