环境
宿主机: window10
服务器: CentOS7(Linux)
Nginx : 1.18.0
网盘映射: RaiDrive
前言
- 什么是Webdav
引用维基百科的解释:
基于Web的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。WebDAV由互联网工程任务组的工作组在RFC 4918中定义。
WebDAV扩展了request方法所允许的标准HTTP谓词和HTTP头。增加的谓词包括:
(1).COPY: 将资源从一个URI复制到另一个URI
(2).LOCK:锁定一个资源,webdav支持共享锁和互斥锁
(3).MKCOL: 创建集合(即目录)
(3).MOVE: 将资源从一个URI移动到另一个URI
(4).PROPFIND: 从Web资源中检索以XML格式存储的属性。它也被重载,以允许一个检索远程系统的集合结构(也叫目录层次结构)。
(5).PROPPATCH: 在单个原子性动作中更改和删除资源的多个属性
(6).UNLOCK: 解除资源的锁定
- 2.Nginx-dav-ext-module是用来干嘛的
官方介绍:
The standard ngx_http_dav_module provides partial WebDAV implementation and only supports GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE methods.
For full WebDAV support in nginx you need to enable the standard ngx_http_dav_module as well as this module for the missing methods.
大致意思就是,标准的ngx_http_dav_module 提供了部分的WebDAV是实现,只支持GET,HEAD, PUT,DELETE,MKCOL,COPY,MOVE 方法,但是为了在Nginx中获取完整的WebDAV支持,就需要启用标准的ngx_http_dav_module这个模块来处理缺少的方法。
构建
下载ngx-dav-ext-module
如果你的服务器上安装了Git可以直接使用下面的命令:
cd /usr/local/src && git clone --recursive https://github.com/arut/nginx-dav-ext-module
如果没有Git 也可以将其在宿主机上下载完成后,上传至服务器。
重新编译Nginx
这里我已经将Nginx提前安装完毕了(使用的是Yum安装的), 但是我们需要重新编译安装,将ngx-dav-ext-module加入到Nginx中。
- 1.查看原有的编译参数
[root@xxxx ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx --group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \
--add-module=/usr/local/src/ngx_cache_purge-2.3 \
--add-module=/usr/local/src/headers-more-nginx-module-0.33
- 2.将原有的Nginx备份
mv /usr/sbin/nginx /usr/sbin/nginx.bak
- 3.下载和自己原有的Nginx版本相同的源码包(如:1.18.0), 并解压
tar -xzvg nginx-1.18.0.tar.gz
cd nginx-1.18.0
- 4.对新版重新编译配置
根据第一步拿到自己的原有的配置,并在后面加入如下的配置:
....
+ --with-http_dav_module --add-module=/usr/local/src/nginx-dav-ext-module
这里的路径一定是要你放置ngx-dav-ext-module的位置,不然后面编译会出现无法找到该路径
※ 如果出现了如下错误:
/configure: error: the HTTP XSLT module requires the libxml2/libxslt
说明缺少依赖:
yum -y install libxml2 libxml2-dev
yum -y install libxslt-devel
- 5.编译
make -j12
# 可以使用 下面的命令查看上一条命令 是否成功
echo ?$
- 5.进入obj目录,替换原有的Nginx
cp objs/nginx /usr/local/nginx/sbin/nginx
确认模块启用
nginx -V
可见配置的参数后面有加载模块:
--with-http_dav_module --add-module=/usr/local/src/nginx-dav-ext-module
创建上传目录
mkdir -p /home/www/webdav
# 设置文件所有者 如果是所有人都可以使用的话设置 nobody:nobody
chown nginx:nginx /home/www/webdav
# 设置文件权限
chmod -R 700 /home/www/webdav
配置身份验证
- 1.安装httpd工具
yum -y install httpd-tools
- 2.创建密码文件
htpasswd -c /opt/soft/.htpasswd dav
# 如果还有用户
htpasswd /opt/soft/.htpasswd user1
- 3.密码文件权限配置
chown nginx:nginx /opt/soft/.htpasswd
chmod 600 /opt/soft/.htpasswd
配置nginx
...
location /webdav {
client_max_body_size 5G; # 最大允许上传文件大小
alias /home/www/webdav;
index index.html index.htm;
autoindex on;
# autoindex_localtime on;
set $dest $http_destination;
# 对目录请求、对URI自动添加"/"
if (-d $request_filename) {
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
# 对MOVE|COPY方法强制添加Destination请求头
if ($request_method ~ (MOVE|COPY)) {
more_set_input_headers 'Destination: $dest';
}
if ($request_method ~ MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
# webdav config
client_body_temp_path /tmp;
dav_methods PUT DELETE MKCOL COPY MOVE; #DAV支持的请求方法
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; # DAV扩展支持的请求方法
create_full_put_path on; # 启用创建目录支持
dav_access group:rw all:r; # 创建文件的以及目录的访问权限
# auth_basic "Authorized Users Only";
# auth_basic "Authorized Users WebDAV";
auth_basic "user login";
auth_basic_user_file /opt/soft/.htpasswd;
}
...
根据自己需求,设置路径,以及文件存路径
- 重启Nginx
sytemctl restart nginx
客户端
我这里使用的是windows,其实有很多工具
如:
Cyberduck: 官方地址: https://cyberduck.io/
我这里使用的是 RaiDrive: 官方地址: http://www.raidrive.com/
输入自己对应的配的配置,然后点击确定 。此时打开我们的资源管理器(win + E)
此时我们就可以像使用本地文件一样操作服务器上的文件了。