MeteorCat / Nginx 架设 WebDAV

Created Fri, 28 Nov 2025 20:40:17 +0800 Modified Fri, 28 Nov 2025 20:40:52 +0800
3361 Words

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 环境或者创建挂载目录:

# 默认安装 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 的配置:

# 如果内外传输可以直接采用 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;  # 关闭代理缓冲,减少内存占用
    }
}

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

# 默认安装 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会自动协调对应协议).

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

# 如果不存在 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 提交|修改|删除的时候, 方便提交的时候直接浏览器下载:

# 如果内外传输可以直接采用 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 暴露出来:

# 内网镜像站不要用 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 服务器负责提供匿名用户浏览下载镜像网站的功能.