一、为什么需要WebDAV数据迁移

想象一下这个场景:你用了很久的云服务器突然要升级配置,或者服务商要停止运营,这时候所有存在WebDAV里的文件都得搬个新家。直接复制粘贴?如果文件少还行,但遇到几TB的数据或者成千上万个小文件,传统方法要么慢得像蜗牛,要么中途出错前功尽弃。

WebDAV(Web Distributed Authoring and Versioning)本质上是个"网络文件夹",适合存代码、文档、多媒体等需要频繁读写的文件。迁移时最怕两件事:一是丢数据,二是服务中断。下面我们就用实际案例,手把手教你如何安全高效地完成迁移。

二、迁移前的准备工作

1. 新旧服务器环境检查

先确认新旧服务器都支持WebDAV协议。以Nginx为例,检查配置里是否有类似这样的段落:

# 技术栈:Nginx WebDAV模块
location /dav {
    dav_methods PUT DELETE MKCOL COPY MOVE; # 启用WebDAV写操作
    dav_ext_methods PROPFIND OPTIONS;       # 支持属性查询
    create_full_put_path on;                # 自动创建路径
    dav_access user:rw group:r all:r;       # 权限设置
    alias /data/webdav;                     # 实际存储路径
}

2. 数据完整性校验

rsync做增量检查比直接拷贝更可靠:

# 技术栈:Linux Shell
rsync -avz --progress --dry-run \
    user@old-server:/data/webdav/ \
    /local/backup/  
# 参数说明:
# -a 归档模式(保留权限等属性)
# -v 显示详细过程  
# -z 压缩传输
# --dry-run 模拟运行(正式迁移时去掉)

3. 制定回滚方案

建议分三个阶段操作:

  1. 首次全量同步(服务不中断)
  2. 差异数据同步(短暂只读模式)
  3. DNS切换后观察(随时可切回)

三、实战迁移方案

方案A:rsync直接同步(适合中小规模)

# 正式迁移脚本(记得去掉--dry-run)
rsync -avz --delete --progress \
    --exclude='*.tmp' --exclude='.trash/' \
    user@old-server:/data/webdav/ \
    /mnt/new-webdav/

# 添加定时任务保持同步(每小时增量)
crontab -e
0 * * * * /usr/bin/rsync -avz --quiet user@old-server:/data/webdav/ /mnt/new-webdav/

优点:几乎适用所有Linux环境,带宽占用低
缺点:大文件可能传输中断,需手动处理冲突

方案B:rclone挂载同步(适合多云场景)

先配置rclone连接两端服务器:

# 技术栈:rclone工具
[oldwebdav]
type = webdav
url = https://old-server/dav
user = admin
pass = ***  

[newwebdav]  
type = webdav  
url = https://new-server/dav  
user = admin  
pass = ***

然后执行双向同步:

rclone sync -P --transfers 8 \
    --webdav-trashtime 24h \
    oldwebdav:/ newwebdav:/  
# 关键参数:
# -P 显示实时进度
# --transfers 并行传输数
# --webdav-trashtime 删除文件先丢回收站

四、迁移后的关键操作

1. 权限修复

WebDAV常用ACL权限问题解决方案:

# 递归修复属主和权限
chown -R www-data:www-data /mnt/new-webdav
find /mnt/new-webdav -type d -exec chmod 775 {} \;
find /mnt/new-webdav -type f -exec chmod 664 {} \;

2. 服务切换测试

用curl模拟客户端请求验证:

# 上传测试
curl -X PUT -T test.txt -u user:pass \
    https://new-server/dav/test.txt

# 属性查询测试  
curl -X PROPFIND -u user:pass \
    https://new-server/dav/ | xmllint --format -

3. 监控与日志分析

配置Nginx日志监控上传异常:

log_format webdav_track '$remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_user_agent"';

server {
    access_log /var/log/nginx/webdav.log webdav_track;
    error_log  /var/log/nginx/webdav_error.log warn;
}

五、避坑指南

  1. 文件名编码问题
    中文文件名建议迁移前统一转为UTF-8:

    convmv -f GBK -t UTF-8 --notest /mnt/new-webdav/*
    
  2. 特殊符号处理
    WebDAV路径中#?%等符号需URL编码:

    # 技术栈:Python处理特殊字符
    from urllib.parse import quote
    safe_path = quote("奇怪&文件名.txt")
    
  3. 软链接陷阱
    使用rsync -L将链接转为实际文件,避免迁移后失效

六、进阶技巧

对于超大规模数据(10TB+),可以考虑:

  1. 分片迁移

    # 按文件扩展名分批迁移
    find /src -name "*.jpg" -exec rsync {} /dst \;
    
  2. 增量同步结合校验

    # 生成校验文件清单
    find /src -type f -exec md5sum {} \; > checksum.list
    # 迁移后验证
    md5sum -c checksum.list | grep -v "OK"
    
  3. 客户端自动重定向
    在旧服务器配置307跳转:

    location /dav {
        return 307 https://new-server/dav$request_uri;
    }
    

七、总结

WebDAV迁移就像给图书馆换书架,既要保证每本书位置正确,又不能影响读者借阅。通过本文的方案,你可以:

  • 零停机完成数据转移(读者无感知)
  • 自动处理百万级小文件(比手动快10倍)
  • 确保权限和属性不丢失(保持原有体系)

最后提醒:迁移完成后务必保留旧服务器数据至少两周,所有客户端缓存过期后再清理。遇到问题欢迎在评论区交流!