Nginx 架设 WebDAV

这里主要讲解的是 WebDAV 服务, 主要核心作用是让客户端(电脑|手机|服务器)
通过网络远程访问/编辑/管理服务器上的文件,和传统的传输功能相比较如下:

协议类型 全称 核心用途 适用场景 特点(优势/劣势) 与 AI 部署的适配性
WebDAV Web-based Distributed Authoring and Versioning 基于 HTTP/HTTPS 的通用文件访问 跨平台(Windows/Mac/Linux/手机)、公网访问、目录挂载、实时协作 优势:无客户端依赖、支持 HTTPS 加密、穿透防火墙、可挂载为本地目录;劣势:传输速度中等、大文件断点续传支持一般 ✅ 高(跨设备共享模型/知识库、无需重复存储、安全公网访问)
SMB Server Message Block 局域网文件共享(Windows 默认) 家庭/办公局域网、Windows 为主的环境、高速文件传输 优势:速度快、支持文件锁/权限控制、大文件传输稳定;劣势:公网访问不安全(需额外加密)、Linux 兼容性一般 ✅ 中高(局域网内 Windows/Mac 访问服务器模型/数据集)
AFP Apple Filing Protocol 苹果设备专用文件共享 Mac/iOS 设备局域网共享 优势:与苹果生态兼容性极佳;劣势:仅支持苹果设备、已被 SMB3 替代 ❌ 低(兼容性差,无额外优势)
NFS Network File System Linux/Unix 系统专用文件共享 Linux 服务器集群、嵌入式设备(开发板)、低延迟访问 优势:轻量、低延迟、适合 Linux 间通信、可挂载为本地目录;劣势:Windows 兼容性差、无原生加密 ✅ 高(Linux 开发板/服务器间模型共享、低资源占用,适配老旧硬件)
FTP File Transfer Protocol 传统文件上传/下载 早期服务器文件传输、简单场景(无安全需求) 优势:部署简单、支持批量传输;劣势:明文传输(账号/数据泄露风险)、无文件锁、穿透防火墙困难 ❌ 低(安全性差,不适合 AI 模型/隐私数据传输)
SFTP SSH File Transfer Protocol 基于 SSH 的安全文件传输 跨平台(Windows/Mac/Linux)、公网/局域网文件传输、安全需求高的场景 优势:加密传输(SSH 隧道)、安全性高、支持断点续传/权限控制、穿透防火墙(仅需 22 端口);劣势:不支持目录挂载(需专用客户端)、传输速度中等 ✅ 中高(安全传输模型/数据集、跨设备上传下载,适合零散文件交互)

按照以上协议需求来比较的选择建议:

需求场景 推荐协议 原因
跨设备目录挂载(如开发板访问服务器文件目录) WebDAV / NFS 支持将服务器目录挂载为本地目录,部分文件可直接读取,无需手动下载
安全传输零散文件(脚本、日志、单篇文档) SFTP 配置简单(依赖 SSH)、加密安全、支持断点续传,适合零散文件交互
局域网内 Windows/Mac 访问服务器文件 SMB 速度快、支持文件锁,Windows/Mac 原生支持,无需额外客户端
公网访问服务器文件(模型/知识库) WebDAV(HTTPS)/ SFTP 均支持加密传输,WebDAV 可挂载目录,SFTP 适合上传下载,按需选择
Linux 服务器/开发板间低延迟访问 NFS 轻量、低资源占用,比 WebDAV/SFTP 延迟更低,适配老旧硬件

实际上如果作为内网家庭管理来说, 更加推荐采用 SMB 服务挂载, 因为大部分设备其实就是常用的 Window PC 和移动端的交互.

但是目前好多在线网盘都对 WebDAV 做不同支持, 连带着很多平台端也默认做了 WebDAV 支持, 因为其天然本身跨平台性和公网易用性导致实用性很广.

需要注意: 暴露公网也说明相比内网部署会迎接更多挑战, 所以对于安全和私密性要求较高就不要搭建, 并且绝对要搭建在 https 服务上

这里基于 debian 系的系统, 首先确认 Nginx 环境或者创建挂载目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 默认安装 nginx 和扩展
sudo apt install nginx nginx-extras

# 确认是否存在 DAV 库, 查看是否输出 ngx_http_dav_ext_module.so
ls /usr/share/nginx/modules|grep dav

# 没问题之后就准备划分落地空间并分配权限
# 推荐插入扩展硬盘之后额外分配进去
sudo mkdir -p /data/dav
sudo chown -R www-data:www-data /data/dav
sudo chmod -R 755 /data/dav

# 创建 nginx 配置文件和用户收取啊年文件
sudo touch /etc/nginx/conf.d/webdav.conf
sudo touch /etc/nginx/webdav_users

编写关于 /etc/nginx/conf.d/webdav.conf 的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 如果内外传输可以直接采用 http 节省下 https 的性能开支
server {
listen 80;
server_name your_domain.com; # 内网用服务器 IP(如 192.168.1.100),公网用域名
return 301 https://$host$request_uri; # 强制跳转 HTTPS(安全优先)
}

server {
listen 443 ssl;
server_name your_domain.com; # 同上
charset utf-8;
root /data/dav; # 共享目录路径

# HTTPS 加密配置(公网必须,内网可选)
# 注意: https 也是有性能开销的, 所以仅作为内网的时候可以降低需求
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # 证书路径
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 安全协议版本
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

# WebDAV 核心配置
location / {

dav_methods PUT DELETE MKCOL COPY MOVE; # 支持的操作(上传/删除/创建目录等)
dav_ext_methods PROPFIND OPTIONS; # 支持目录挂载的核心方法
dav_access user:rw group:rw all:r; # 访问权限

# 身份验证(避免匿名访问,保护文件安全)
auth_basic "Nginx Share WebDAV"; # 登录提示语
auth_basic_user_file /etc/nginx/webdav_users; # 用户名密码文件路径

# 优化大文件传输
client_max_body_size 100G; # 允许最大上传文件大小(根据文件大小调整)
client_body_buffer_size 128k; # 缓冲区大小(低内存设备可设为 64k)
proxy_buffering off; # 关闭代理缓冲,减少内存占用
}
}

创建用户或者并启动服务:

1
2
3
4
5
6
7
# 默认安装 nginx 自定携带 htpasswd, 如果没有可以输入 sudo apt install apache2-utils 安装
# 这里将创建 meteorcat 托管给内部 webdav_users 文件
sudo htpasswd -c /etc/nginx/webdav_users meteorcat
# 按提示输入密码(建议复杂密码,如包含大小写+数字+符号)

# 重启 NGINX
sudo systemctl restart nginx

一般挂载需要采用 dav://{服务地址}(基于http) 或者 davs://{服务地址}(基于https),
window 一般只需要原生映射 http/https 即可(window会自动协调对应协议).

而如果需要采用服务器挂载, 则需要命令行额外扩展命令:

1
2
3
4
5
6
# 如果不存在 davfs 命令就需要安装组件
sudo apt install davfs2

# webdav 挂载命令(使用 dav:// 或 davs://)
# 后续可以考虑写入 /etc/fstab 之中, 实现开机自动挂载
sudo mount -t davfs davs://192.168.1.100 /mnt/dav

另外默认是打开浏览器访问的时候应该登陆是无法看到内容, 实际上需要手动开启 autoindex/fancyindex 才允许被访问文件列表,
这里推荐采用 fancyindex+dav 实现 dav 提交|修改|删除的时候, 方便提交的时候直接浏览器下载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 如果内外传输可以直接采用 http 节省下 https 的性能开支
server {
listen 80;
server_name your_domain.com; # 内网用服务器 IP(如 192.168.1.100),公网用域名
return 301 https://$host$request_uri; # 强制跳转 HTTPS(安全优先)
}

server {
listen 443 ssl;
server_name your_domain.com; # 同上
charset utf-8;
root /data/dav; # 共享目录路径

# HTTPS 加密配置(公网必须,内网可选)
# 注意: https 也是有性能开销的, 所以仅作为内网的时候可以降低需求
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; # 证书路径
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 安全协议版本
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

# WebDAV 核心配置
location / {

dav_methods PUT DELETE MKCOL COPY MOVE; # 支持的操作(上传/删除/创建目录等)
dav_ext_methods PROPFIND OPTIONS; # 支持目录挂载的核心方法
dav_access user:rw group:rw all:r; # 访问权限

# 身份验证(避免匿名访问,保护文件安全)
auth_basic "Nginx Share WebDAV"; # 登录提示语
auth_basic_user_file /etc/nginx/webdav_users; # 用户名密码文件路径

# 优化大文件传输
client_max_body_size 100G; # 允许最大上传文件大小(根据文件大小调整)
client_body_buffer_size 128k; # 缓冲区大小(低内存设备可设为 64k)
proxy_buffering off; # 关闭代理缓冲,减少内存占用

# 浏览器目录展示
fancyindex on; # 启用fancyindex
fancyindex_exact_size off; # 人性化文件大小
fancyindex_localtime on; # 本地时间
fancyindex_name_length 255; # 显示完整文件名
# 忽略 .log 结尾| .tmp 结尾 | 隐藏文件(以.开头)| test 目录
fancyindex_ignore "\.log$|\.tmp$|^\..+$|^test$";
}


# 规则1:禁止访问所有.log/.tmp后缀的文件(任意目录下)
location ~* \.(log|tmp)$ {
deny all;
return 404; # 伪装成资源不存在,比403更安全
}

# 规则2:禁止访问根目录下的.test/.*隐藏目录/文件(任意目录下)
location ~* /(\..+|test) {
deny all;
return 404;
}

# 个别隐藏文件需要允许访问(如/favicon.ico), 可在禁止规则前添加允许规则
location = /favicon.ico {
allow all;
auth_basic off; # 关闭该类文件的身份验证
try_files $uri =404;
}
}

这样就能实现 WebDAV 提交文件 + 浏览器浏览下载 的功能.

再次提醒: 输入密码的授权是明文写入在 Authorization: Basic {base64}Header, 一定要小心 HTTP 中间人拦截攻击

这里还有种方式就是搭建某些海外的镜像源站, 比如需要完成以下需求:

  • 匿名的访问者可以直接浏览
  • 登陆者可以直接通过DAV提交文件

比较常用的就是内网有个脚本同步拉取海外资源保存本地, 下载资源目录是 WebDAV 挂载的, 最后就是 nginx 暴露出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 内网镜像站不要用 https, 因为资源本身很庞大不需要这些开销
server {
listen 80;
server_name your_domain.com; # 同上
charset utf-8;
root /data/dav; # 共享目录路径


# WebDAV 核心配置
location / {

# WebDAV 写操作配置
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;

# 仅对非 GET/HEAD 方法强制身份验证
limit_except GET HEAD {
# 身份验证(仅写操作需要)
auth_basic "WebDAV 写操作需要登录";
auth_basic_user_file /etc/nginx/webdav_users;
}


# 优化大文件传输
client_max_body_size 100G; # 允许最大上传文件大小(根据文件大小调整)
client_body_buffer_size 128k; # 缓冲区大小(低内存设备可设为 64k)
proxy_buffering off; # 关闭代理缓冲,减少内存占用

# 浏览器目录展示
fancyindex on; # 启用fancyindex
fancyindex_exact_size off; # 人性化文件大小
fancyindex_localtime on; # 本地时间
fancyindex_name_length 255; # 显示完整文件名
# 忽略 .log 结尾| .tmp 结尾 | 隐藏文件(以.开头)| test 目录
fancyindex_ignore "\.log$|\.tmp$|^\..+$|^test$";
}


# 规则1:禁止访问所有.log/.tmp后缀的文件(任意目录下)
location ~* \.(log|tmp)$ {
deny all;
return 404; # 伪装成资源不存在,比403更安全
}

# 规则2:禁止访问根目录下的.test/.*隐藏目录/文件(任意目录下)
location ~* /(\..+|test) {
deny all;
return 404;
}

# 个别隐藏文件需要允许访问(如/favicon.ico), 可在禁止规则前添加允许规则
location = /favicon.ico {
allow all;
auth_basic off; # 关闭该类文件的身份验证
try_files $uri =404;
}
}

这样就可以通过远程另外服务器挂载 dav 盘负责下载, 另外的 nginx 服务器负责提供匿名用户浏览下载镜像网站的功能.