相关文章

基于nginx的webdav服务

 |   

最近将终端从 item2 迁移到 tabby 了,原因就在于后者是跨平台的。但是碰到了跨平台软件的通病就是配置的同步问题。为了永久解决类似的问题,所以研究了一下 WebDAV,并且搭建了服务来给跨平台软件同步基本配置。

介绍

之所以研究 WebDAV 是因为跨平台的终端 tabby 需要同步终端配置和连接,在插件 cloud-settings-sync 的支持下能够将全平台的配置同步到 WebDAV 服务上。相较于同样基于 HTTP 1.1 的静态资源服务,它更加的安全,特别是针对多端对同一个资源进行修改时。而相较于文件传输协议 FTP,它基于 HTTP 1.1,使用浏览器或基本命令 curl 即可对文件进行读写,而不需要专门的软件或客户端,非常的方便。所以就通过 Nginx 搭建了 WebDAV 服务来提供类似网盘的能力。

基本概念

在构建 WebDAV 以及使用它之前,需要了解它的起源以及优势。

定义

WebDAV(英语:Web-based Distributed Authoring and Versioning)中文名是基于Web分布式编写版本控制。它是超文本传输协议 HTTP 的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。WebDAV 最终在 2007 年由互联网工程任务组(IETF)的工作组在 RFC 4918 中定义。

具体点来说, WebDAV 在原先 HTTP 1.1 所支持的 GET, POST, HEAD 等常见的 HTTP 标准方法外,还添加了一些新的方法,比如维护作者或修改日期等属性方法:PROPPATCH, PROPFIND,处理覆盖保护相关的资源锁定方法:LOCK, UNLOCK等。从而实现对网络资源的分布式编写以及版本控制。

而通俗一点儿来说,WebDAV 是 HTTP 的加强版,能够直接查看,编辑,下载网络资源。同时还提供用户名和密码来控制访问,保证资源的安全性。非常适合做网盘系统的协议

起源

WebDAV 创始于 1996 年,当时加州大学尔湾分校博士毕业生 Jim Whitehead 与 W3C 共同主办了两场会议,与感兴趣的人讨论万维网上的分布式创作问题。作为万维网之父的 Berners Lee 对网络的最初看法是涉及阅读和写作的介质。事实上,Berners Lee 的第一个 Web 浏览器(WorldWideWeb)其实既可以查看也可以编辑网页;但是,随着网络的成长,对大多数用户来说成为了只读介质。Jim Whitehead 和其他志同道合的人想超越这个限制。

W3C 会议决定成立一个 IETF 工作组,因为新的工作将导致对 HTTP 进行扩展,而当时 IETF 已经开始对 HTTP 进行标准化。随着协议的工作开始,很明显,同时处理分布式编写和版本控制将涉及太多的工作,并且任务将不得不分开。WebDAV 小组专注于分布式创作,将版本控制留作以后研究。在 1999 年互联网工程指导组(IESG)接受 RFC 2518 的增量更新之后,WebDAV 工作组在 2007 年 3 月结束了其工作。当时还没有完成的其他扩展,比如 BIND 方法,已经由其独立作者独立于正式工作组完成。

优势

  • 便携性

WebDAV 最大的优势就是便携性,因为 Web 已经成为 Internet 的基础,所以 WebDAV 可以普适目前所有情况。任何浏览器或者简单的 curl 命令 都可以操作服务上的文件,不需要额外安装客户端工具。

  • 天然网盘

相较于 HTTP 只能访问单个的静态资源,使用 WebDAV 协议的服务不仅支持读,还可以写入。此外还可以将资源当做文件来进行管理,简直就是天生的网盘协议。

  • 安全性

基于 WebDAV 的服务不仅提供了用户密码鉴权认证,还可以针对资源进行加锁以防止多个客户端同时篡改同一个资源,从而导致数据不一致的问题。

实战

Apache 和 Nginx 都是支持 WebDAV,可作为 WebDAV 文件共享服务器软件。当然也可以使用专门的 WebDAV 软件部署。其中 Nginx 对 WebDAV 的支持不是太全面,所以功能比较少,不过简单的网盘功能已经提供。

Nginx

Nginx 启用基本的 WebDAV 只需要在编译配置时加上 --with-http_dav_module 即可启用基本的 WebDAV 功能, 这些基本功能包括 PUT/DELETE/MKCOL/COPY/MOVE 等。如果想要 WebDAV 能够支持来自应用的同步操作,还需要额外安装 nginx-dav-ext-module 模块。

安装

对于 Ubuntu 系统可以执行以下命令来进行安装和校验。

1# 安装 dav 对应的模块
2sudo apt -y install nginx nginx-extras libnginx-mod-http-dav-ext
3# 验证包含模块 http_dav_module 和 http-dav-ext
4nginx -V | grep -qE "http_dav_module|http-dav-ext"

配置

配置包括两步,第一步是 Nginx 的配置,详细可参考下面的配置。其中关键点有

  • 配置域名,并且同时开通 HTTP(80) 和 HTTPS(443)来访问服务: https://your.siteHTTPS服务搭建参考
  • 数据目录配置在 /data/webdav/data
  • 认证配置文件在 /data/webdav/.credentials.list
 1server {
 2  listen 80;
 3  server_name your.site;
 4
 5  rewrite ^(.*) https://$server_name$1 permanent;
 6}
 7
 8server {
 9    listen  443 ssl;
10    server_name your.site;
11
12    ssl_certificate /etc/letsencrypt/live/your.site/fullchain.pem;
13    ssl_certificate_key /etc/letsencrypt/live/your.site/privkey.pem;
14    ssl_session_timeout 5m;
15    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
16    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
17    ssl_prefer_server_ciphers on;
18
19    # 认证方式
20    auth_basic              "Authenticated Users";
21    # 存放认证用户名、密码文件(确认有对应权限)
22    auth_basic_user_file    /data/webdav/.credentials.list;
23
24    # webdav服务访问的根目录
25    root /data/webdav/data;
26    index index.html index.htm index.nginx-debian.html;
27
28    access_log   /var/log/nginx/webdav.log;
29    error_log   /var/log/nginx/webdav.log;
30    location / {
31       # 启用 WebDav 的一些关键字
32       dav_methods PUT DELETE MKCOL COPY MOVE;
33       # 启用 WebDav 的一些扩展关键字用于支持应用访问
34       dav_ext_methods PROPFIND OPTIONS;
35       # 设置 WebDav 目录下新增文件的默认权限
36       dav_access user:rw group:rw all:r;
37       # 创建文件夹时自动创建路径上不存在的文件夹
38       create_full_put_path  on;
39       # 设置报文最大长度便于文件传输,这里为8MB
40       client_max_body_size 8m;
41
42       # 让 nginx 自动生成索引页面,避免 403 错误
43       autoindex on;
44    }
45}

第二步是设置登陆用户和密码将其保存到配置指定文件中。

1## 登陆密码
2### 添加一个用户,username 为用户名
3echo -n 'username:' | sudo tee -a /data/webdav/.credentials.list
4### 设置用户的密码
5openssl passwd -apr1 | sudo tee -a /data/webdav/.credentials.list

验证

验证方式有两种,一种通过浏览器访问 https://your.site, 通过用户名密码进行访问。另一种是通过 curl 命令进行验证。

1# 验证
2## 上传
3curl --user username:password https://your.site/ -T fileName
4## 下载
5curl --user username:password https://your.site/fileName > tmpFile

WebDAV 服务

webdav 是 GitHub 上开源的项目,基于 Go 语言实现,不仅跨平台,还支持 ARM 架构,可在㠌入式设备中部署 WebDAV 服务器。目前 Nginx 够用,所以这块暂时没有进一步探究。

扩展

最后提供一些支持 WebDAV 的软件列表,以供后续探索

软件名使用中描述
Zotero[X]一款文献管理工具
PDF Expert[ ]pdf 文件阅读工具,使用 webdav 可以直接阅读网盘中的 pdf 文件
keepass[X]支持 webdav 的密码管理器
Documents[ ]IOS 系统文件管理工具,支持 webdav
静读天下[ ]支持多种电子书籍格式的阅读软件
MWeb[X]专业的 Markdown 写作软件
书伴[ ]一款支持 OCR 文本识别功能的书籍管理应用

参考文献

  1. webdav 维基百科
  2. webdav Server
  3. nginx 配置 WebDAV
技术茶话会
< 前一篇