WebDAV ,全称是 Web-based Distributed Authoring and Versioning,维基百科上对它的解释是这样的:基于 Web 的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。
使用原因
类似技术,我们常见的是文件传输协议(FTP),他在 RFC 959 中定义,于 1985 年 10 月发布,被设计成为一个跨平台的、简单且易于实现的协议。但时至今日,却已江河日下,因为存在一些历史问题,大致以一下几点:
- 密码安全策略不完善
- 与防火墙工作不协调
- 无法对操作进行细化处理
- 效率不高,速度较慢
与 FTP 相比,WebDAV 具有以下优点:
- 通过一个 TCP 连接,可以更轻松地将其配置为绕过防火墙,NAT 和代理。 在 FTP 中,数据通道可能会导致正确的 NAT 设置出现问题。
- 同样,由于一个 TCP 连接可以持久,因此在传输许多小文件时,WebDAV 将比 FTP 快一点-无需为每个文件建立数据连接。
- GZIP 压缩是 HTTP 的标准,但不是 FTP 的标准(是的,FTP 中提供了 MODE Z,但未在任何标准中定义)。
- HTTP 有很多未在 FTP 中定义的身份验证方法。 例如。 NTLM 和 Kerberos 身份验证在 HTTP 和 FTP 中很常见,除非您同时编写 FTP 的客户端和服务器端,否则很难获得对它们的适当支持。
- WebDAV 支持部分传输,在 FTP 中无法部分上传(即,您不能覆盖文件中间的块)。
因此 WebDAV 是一个替代 FTP 不错的方案
安装
目前 Apache 和 Nginx 均支持 WebDAV,可作为 WebDAV 文件共享服务器软件,但这里推荐使用 https://github.com/hacdias/webdav,基于 Go 语言实现,不仅跨平台,还支持 ARM 架构,可在㠌入式设备中部署 WebDAV 服务器。
首先下载对应的执行程序 webdav ,然后创建配置文件 webdav.yml
# 地址
address: 0.0.0.0
# 端口
port: 991
# 用户验证
auth: true
# 开启TLS
tls: false
# 证书与密钥
cert: cert.pem
key: key.pem
# 访问前缀
prefix: /
# 用户默认配置,自动合并
# 作用路径
scope: .
# 是否允许修改
modify: true
# 规则
rules: [ ]
# 跨域设置
cors:
enabled: true
credentials: true
allowed_headers:
- Depth
allowed_hosts:
- http://localhost:8080
allowed_methods:
- GET
exposed_headers:
- Content-Length
- Content-Range
# 用户定义
users:
- username: admin
password: admin
scope: /a/different/path
- username: encrypted
password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
- username: "{env}ENV_USERNAME"
password: "{env}ENV_PASSWORD"
- username: basic
password: basic
modify: false
rules:
- regex: false
allow: false
path: /some/file
- path: /public/access/
modify: true
开始运行
webdav -c ./webdav.yml
守护
运行测试后可将其加入进程守护,首先准备:
迁入用户执行
cp webdav /usr/local/bin
chmod +x /usr/local/bin/webdav
规范配置路径
cp webdav.yml /opt/webdav
创建 webdav.service 在 /etc/systemd/system 目录中:
[Unit]
Description=WebDAV server
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/webdav --config /opt/webdav/webdav.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务,并加入自启
systemctl enable webdav
systemctl start webdav