最近将终端从 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.site。 HTTPS服务搭建参考。
- 数据目录配置在 /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 文本识别功能的书籍管理应用 |