Why
我们之前为网站部署过其他文件传输服务:
WebDAV也是一种文件传输的协议,为什么我们需要它呢?
WebDAV是HTTP协议的扩展,支持用户在远程服务器上协同编辑和管理文件。它允许用户创建、移动、复制和删除服务器上的资源,并支持锁定机制以防止冲突。由于其基于标准HTTP/HTTPS端口,WebDAV极易穿透防火墙,且天然支持加密传输,广泛用于云存储同步和远程内容管理,兼具良好的兼容性与安全性。
FTP传输效率高,适合大文件批量处理;SMB在局域网内共享体验流畅,集成度高。WebDAV则凭借HTTP兼容性,在跨网络访问和防火墙穿透方面表现优异。总的来说,三者各有侧重,分别适用于不同场景下的文件传输与管理需求。比如,SMB可以在局域网环境更适用,FTP在传输效率上更占优,而WebDAV则能够把远端存储像加载磁盘一样连接到本地。像是一些备份任务,就比较适合使用WebDAV。
部署
配置WebDAV很简单,特别是我们已经使用了nginx时,可以直接使用nginx配合其他模块完成部署。
参考文章:在Nginx上配置并开启WebDAV服务的完整指南 - 写bugs - 博客园
这篇文章在很多细节上没讲清楚,很容易踩坑,下文会提到。
检查环境
首先要确保 Nginx 安装了 WebDAV 模块。Nginx 的 WebDAV 功能由 http_dav_module 模块提供,默认是有的,但为了以防万一,可以检查一下:
nginx -V 2>&1 | grep -o with-http_dav_module
如果输出包含 with-http_dav_module,则模块已启用。否则可能需要加模块,或者换用其他版本的nginx进行编译。
选取根目录(可选)
如果WebDAV使用独立的目录位置,则可以跳过这步。
这个参考文章就没提到。我们是希望FTP、SMB能够共用一个目录的,这就牵扯到权限问题。
- FTP:使用vsftpd,利用ubuntu的用户认证,所以目录权限归属于ftpuser
- SMB:使用自己的密码验证系统,在配置中指定了登陆者为ftpuser
- WebDAV:使用nginx代理,所以文件交互由用户www-data完成
这就产生了权限的冲突:文件夹是归属于ftpuser,而nginx又需要通过用户www-data完成读写。
这里以/path/to/ftp/为例,作为已有的FTP根目录;而WebDAV要与FTP共享使用该目录。
# 把 www-data 加入组 ftpuser 中
sudo usermod -a -G ftpuser www-data
# 检查 www-data 用户都在哪些组里(注意不是在检查www-data组的成员)
groups www-data
# 此时应该可以看到输出 www-data : www-data ftpuser
# 文件夹归属ftpuser所有,但是组内其他用户也可以读写
sudo chown -R ftpuser:ftpuser /path/to/ftp
cd /path/to/ftp
# 批量修改文件夹权限
find ./ -type d -exec chmod 775 {} \;
# 批量修改文件权限
find ./ -type f -exec chmod 664 {} \;
# 别忘了,www-data创建的文件,你也想让ftp用户可以读取到,所以记得反过来再配置组……
sudo usermod -a -G www-data ftpuser
# 检查 ftpuser 是否加入了 www-data
groups ftpuser
至此,/path/to/ftp/这个目录就同时可以被FTP、SMB(在之前文章介绍过)、WebDAV使用了。
配置用户和密码
推荐使用认证!!!你也不想让自己的WebDAV在网上裸奔吧。
首先需要安装apache2-utils这个组件,它包含htpasswd 。htpasswd 是 Apache HTTP Server 工具包中的一个实用程序,用于管理存储用户认证信息的文本文件(即 .htpasswd 文件)。
htpasswd 负责创建、更新和删除该文件中用户的条目。存储的文件每一行包含用户名和加密的密码,密码经过哈希加密(如 bcrypt, SHA-1, MD5等),即使文件泄露,原始密码也不会直接暴露。虽然名字里有 httpd (Apache),但它生成的文件格式是通用的。Nginx 完全支持读取这种格式的文件进行 Basic Auth 认证,不需要安装 Apache 服务器即可使用此命令。
注意,此处创建的用户名不必是ubuntu现有用户,可以自己起名字。当然也可以为了方便(真的是方便吗?)重名,但密码是分开管理的。
然后你还需要选一个位置存放这个加密的密码文件,因为用的是nginx,所以使用该默认路径。完整命令如下:
# 安装
sudo apt install apache2-utils
# 向选定的密码文件中添加一个用户,接着按照提示输入密码
sudo htpasswd -c /etc/nginx/.htpasswd yourUserName
配置nginx
再开始配置前,最好安装完整的nginx,会包含一些组件。
# 安装完全版
sudo apt install nginx-full
# 检查模组文件夹
ls /usr/lib/nginx/modules
正常来说,应该可以找到 ngx_http_dav_ext_module.so这个文件
特别注意!需要手动修改nginx总配置,启用这个模组。
使用vim修改配置:
# 修改nginx总配置
vim /etc/nginx/nginx.conf
需要在“http”块前添加对ngx_http_dav_ext_module.so的引用,修改如下:
# ===== 以下都是默认配置,不用修改 =====
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
# ===== 以上都是默认配置,不用修改 =====
# 在http模块前添加对模组的引用
load_module /usr/lib/nginx/modules/ngx_http_dav_ext_module.so;
# ===== 后面都不用改 =====
配置nginx文件,如何启用conf文件、使用软链接、自动更新SSL等可以参考往期文章。真实环境请配置SSL!!!否则不安全。
参考配置如下:
server {
listen 80;
listen [::]:80;
server_name example.com;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
#监听443端口
listen 443 ssl;
listen [::]:443 ssl;
#你的域名
server_name example.com;
#ssl证书的pem文件路径
ssl_certificate /your/path/to/keys/example.fullchain.pem;
#ssl证书的key文件路径
ssl_certificate_key /your/path/to/keys/example.com.key;
# 设置最大大小, WebDAV需要处理文件上传,需要开的大一点
client_max_body_size 50M;
# 转发配置
location /webdav {
# 设置 WebDAV 的存储根路径
root /srv/ftp;
autoindex on;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
# 认证配置 使用 htpasswd 进行认证
auth_basic "WebDAV Authentication";
auth_basic_user_file /etc/nginx/.htpasswd;
# 解决中文乱码问题
charset utf-8;
charset_types text/plain application/xml application/json;
}
}
这里有几个要点:
- 没有像参考文章中一样配置
dav_ext_methods和create_full_path,应该是组件支持问题。- 我设置了,我的这个版本可以支持
dav_ext_methods PROPFIND OPTIONS;而且完全够用了。 - 参考文章中的
PROPFIND PROPPATCH MKACTIVITY CHECKOUT;并不能完全支持。 - 这个版本似乎也不支持
create_full_path,但是关掉也完全能用。
- 我设置了,我的这个版本可以支持
- 解决了中文乱码问题,强制使用utf-8编码。
- 你可以在主域名
example.com前加二级域名,来天然分流。 - 也可以在location后配置路径来分流。
测试
接下来就可以登录你的WebDAV进行测试了!它应该一切正常!
注意几个要点:
- 可以试用
sudo service nginx restart重启服务; - 测试前可以试用
sudo nginx -t先检查配置文件; - 注意看是否要求你登录,是否启用了SSL;
- 注意看是否有中文字符乱码。

Comments NOTHING