Franz`s blog

Openresty 实现 WebDAV 功能 ,并且实现在 WebDAV 下多用户认证以及访问目录控制

0.介绍

基于Web的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。WebDAV由互联网工程任务组的工作组在RFC 4918中定义。
WebDAV协议为用户在服务器上创建、更改和移动文档提供了一个框架。WebDAV协议最重要的功能包括维护作者或修改日期的属性、名字空间管理、集合和覆盖保护。维护属性包括创建、删除和查询文件信息等。名字空间管理处理在服务器名称空间内复制和移动网页的能力。集合(Collections)处理各种资源的创建、删除和列举 (from wikipedia) wikipedia

nginx 中的 ngx_http_dav_module 模块提供了该功能的支持,nginx-dav-ext-module 主要是实现了 NGINX WebDAV 未实现的命令支持,包括:PROPFIND & OPTIONS 对于完整的 WebDAV 支持

通过 windows 自带的网络驱动器映射可以实现以下效果

image-20230325204817756

1.Openresty 的编译与安装

OpenResty 是一个基于 Nginx 的 Web 平台,整合了诸如 LuaJIT、LuaNginxModule 等模块,所以我们用 Openresty 代替 nginx

因为webdav需要 ngx_http_dav_module 以及 nginx-dav-ext-module 的支持 ,所以我们要自己编译自己的Openresty

环境 Ubuntu 22.04

1.1 Openresty 源代码下载

通过 Openresty 官方网站获取最新的源代码并且解压

1
2
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
tar -xzvf openresty-1.21.4.1.tar.gz

1.2 开发依赖安装

1
2
3
4
5
apt-get update

apt-get install libpcre3-dev \
libssl-dev perl make build-essential curl \
libxml2 libxml2-dev libxslt-dev

1.3 下载 nginx-dav-ext-module 并且配置编译时所添加的module

1
2
3
4
5
6
7
8
9
10
cd openresty-1.21.4.1

wget https://codeload.github.com/arut/nginx-dav-ext-module/tar.gz/refs/tags/v3.0.0 -O nginx-dav-ext-module.tar.gz

tar -xzvf nginx-dav-ext-module.tar.gz

./configure --prefix=/usr/local/openresty \
--with-http_dav_module \
--add-module=nginx-dav-ext-module \
--without-http_gzip_module

1.4 编译并且安装

1
2
3
gmake

gmake install

执行上述命令后会发现 Openresty 已经安装在 /usr/local/openresty 但是 openresty 命令还是不可用,可以通过添加软连接实现可以在任意文件夹使用 openresty 命令

1
2
3
4
cd /usr/local/openresty/bin

sudo ln -s `pwd`/openresty /usr/local/bin/openresty
sudo ln -s `pwd`/opm /usr/local/bin/opm

运行 Openresty 访问 http://localhost 将会出现 Welcome to OpenResty! 字样,代表 OpenResty 已经安装成功!

image-20230325205506326

2. 最简单的 Webdav 实现

修改配置文件 /usr/local/openresty/nginx/conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
... # 你自己的某些配置

server {
...

location / {
# webdav 访问的根目录 ,暂时使用root
root /www/wwwroot/webdav;
# 文件暂存地址
client_body_temp_path /www/wwwroot/webdav/client_temp;
# webdav 支持的方法
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;

create_full_put_path on;
dav_access user:rw group:rw all:r;
# 网页页面自动索引文件
autoindex on;
}
}
}

这样可以实现最基本的无认证,无动态目录WebDAV

这篇我们编译了带实现 webdav module支持的openresy ,并且实现了最简单的WebDAV,下一篇将会通过编写lua脚本实现多用户认证,以及动态控制访问目录的功能(应该会很快写出来)