阿里云服务器 + 宝塔面板 搭建 WebDAV 服务完整教程

观众 发布于 阅读:172

适用于阿里云服务器(或其他云服务器),使用宝塔面板搭建支持 HTTPS 的 WebDAV 服务,可作为私人网盘或文件同步服务使用。

一、准备工作

1.1 环境要求

  • 一台云服务器(阿里云 / 腾讯云 / 华为云等),已安装宝塔面板
  • 一个已解析到服务器的域名(本教程以 dav.example.com 为例,请替换为你自己的域名)
  • 服务器操作系统:CentOS / Alibaba Cloud Linux / RHEL 系列

1.2 放行端口

在开始前,必须先在云服务商控制台放行端口

端口 用途
80 HTTP 访问
443 HTTPS 访问

操作路径:阿里云控制台 → 安全组 → 配置规则 → 入方向 → 添加安全组规则

⚠️ 注意:宝塔面板自身的「安全」菜单中,也需要放行相应端口,两边缺一不可。

二、申请 SSL 证书(启用 HTTPS)

  1. 登录宝塔面板,进入 「网站」 页面
  2. 点击 「添加站点」
    • 域名:填写你的域名(如 www.dav.example.com
    • 根目录:/WebDAV(建议使用此路径)
    • PHP 版本:选择任意版本(WebDAV 不需要 PHP,但如果站点有其他用途可按需选择)
  3. 站点创建成功后,点击站点 「设置」「SSL」
  4. 选择 「Let's Encrypt」,勾选你的域名,点击 「申请」
  5. 申请成功后,确保「强制 HTTPS」处于开启状态
💡 提示:如果申请证书时报 DNS problem: NXDOMAIN 错误,说明域名未解析或解析未生效,请先去域名解析商处添加 A 记录。

三、确认 Nginx 支持 WebDAV

3.1 检查模块是否已安装

通过 SSH 连接服务器,执行以下命令:

nginx -V 2>&1 | grep -o with-http_dav_module
  • 如果有输出 with-http_dav_module:说明基础模块已安装,继续下一步。
  • 如果没有任何输出:说明模块未安装,需要重新编译 Nginx。

3.2 如果缺少模块,重新编译 Nginx

  1. 下载 WebDAV 扩展模块:
    git clone https://github.com/arut/nginx-dav-ext-module.git /www/server/nginx-dav-ext-module
  2. 在宝塔面板 「软件商店」 中,卸载当前已安装的 Nginx。
  3. 重新点击 Nginx 「安装」务必选择「编译安装」,在「自定义模块」或「编译参数」中完整填入:
    --with-http_dav_module --add-module=/www/server/nginx-dav-ext-module --with-http_ssl_module
  4. 点击提交,等待编译完成(约 15-30 分钟)。
  5. 验证安装:
    nginx -V 2>&1 | grep -o with-http_dav_module
    nginx -V 2>&1 | grep "dav-ext"

    两个命令都应有输出。

四、配置 Nginx 站点

4.1 修改站点配置文件

在宝塔面板中,点击站点 「设置」「配置文件」,将以下内容完整替换(注意替换其中的域名为你自己的域名):

# ============================================================
# 请将下方所有 dav.example.com 替换为你的实际域名
# ============================================================

server
{
    listen 80;
    listen 443 ssl;
    http2 on;
    server_name dav.example.com www.dav.example.com;   # 替换为你的域名
    index index.php index.html index.htm default.php default.htm default.html;
    root /WebDAV;   # WebDAV 根目录
    #CERT-APPLY-CHECK--START
    include /www/server/panel/vhost/nginx/well-known/dav.example.com.conf;   # 替换为你的域名
    #CERT-APPLY-CHECK--END
    include /www/server/panel/vhost/nginx/extension/dav.example.com/*.conf;   # 替换为你的域名

    #SSL-START
    #HTTP_TO_HTTPS_START
    set $isRedcert 1;
    if ($server_port != 443) {
        set $isRedcert 2;
    }
    if ( $uri ~ /\.well-known/ ) {
        set $isRedcert 1;
    }
    if ($isRedcert != 1) {
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/dav.example.com/fullchain.pem;   # 替换为你的域名
    ssl_certificate_key    /www/server/panel/vhost/cert/dav.example.com/privkey.pem;   # 替换为你的域名
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_tickets on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
    #SSL-END

    #ERROR-PAGE-START
    error_page 404 /404.html;
    #ERROR-PAGE-END

    #PHP-INFO-START
    include enable-php-82.conf;
    #PHP-INFO-END

    #REWRITE-START
    include /www/server/panel/vhost/rewrite/dav.example.com.conf;   # 替换为你的域名
    #REWRITE-END

    # ============================================================
    # 以下为 WebDAV 核心配置(关键!)
    # ============================================================

    location / {
        # WebDAV 核心指令
        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
        create_full_put_path on;
        dav_access user:rw group:r all:r;
        client_max_body_size 102400M;

        # 密码验证
        auth_basic "WebDAV Login";
        auth_basic_user_file /www/wwwroot/dav.example.com/.htpasswd;   # 替换为你的站点目录
    }

    # 禁止访问的敏感文件
    location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$
    {
        return 404;
    }

    # 禁止访问的敏感目录
    location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ {
        return 404;
    }

    # SSL证书验证目录
    location ~ \.well-known{
        allow all;
    }

    # 禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
    access_log  /www/wwwlogs/dav.example.com.log;   # 替换为你的域名
    error_log  /www/wwwlogs/dav.example.com.error.log;   # 替换为你的域名
}
⚠️ 注意:将配置中所有 dav.example.com 替换为你的实际域名。

五、创建访问密码

5.1 生成密码文件

WebDAV 需要用户名密码验证。通过 SSH 执行以下命令:

# 生成加密密码(将「你的密码」替换为你的实际密码)
openssl passwd -apr1 你的密码 > /tmp/pwd.txt

# 创建密码文件(将「你的用户名」替换为你的实际用户名)
echo "你的用户名:$(cat /tmp/pwd.txt)" > /www/wwwroot/你的站点目录/.htpasswd

# 查看密码文件内容,确认格式正确
cat /www/wwwroot/你的站点目录/.htpasswd

正确的密码文件格式应为:

用户名:$apr1$xxxxx$xxxxxxxxxxxxxxxxxxxxx
💡 提示:如果系统提示 openssl: command not found,先安装:yum install -y openssl

5.2 设置密码文件权限

chown www:www /www/wwwroot/你的站点目录/.htpasswd
chmod 644 /www/wwwroot/你的站点目录/.htpasswd

六、创建 WebDAV 根目录并设置权限

# 创建根目录
mkdir -p /WebDAV

# 设置所有者(宝塔 Nginx 运行用户为 www)
chown -R www:www /WebDAV
chmod -R 755 /WebDAV
💡 .user.ini 的权限警告可以忽略,不影响 WebDAV 功能。

七、重启 Nginx 并验证

7.1 测试配置并重启

# 测试配置文件语法
nginx -t

# 重载 Nginx
nginx -s reload

如果 nginx -t 报错,根据提示修正配置文件后再重试。

7.2 验证 WebDAV 功能

# 测试 PROPFIND(列出文件)
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"

# 测试上传
echo "Hello WebDAV" > /tmp/hello.txt
curl -k -u 用户名:密码 -T /tmp/hello.txt https://你的域名/hello.txt

# 验证上传是否成功
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"

成功标志:返回 HTTP/1.1 207 Multi-Status 和 XML 格式的文件列表,并能看到上传的 hello.txt

八、客户端连接

8.1 连接信息

项目 内容
地址 https://你的域名/
用户名 你设置的用户名
密码 你设置的密码

8.2 Windows 客户端推荐:RaiDrive

  1. 下载安装 RaiDrive(免费版即可)
  2. 点击 「添加」 → 选择 「NAS」「WebDAV」
  3. 填写信息:
    字段 填写内容
    地址 你的域名(如 www.dav.example.com不要写 https://
    端口 443(保持默认)
    用户名 你设置的用户名
    密码 你设置的密码
    协议 勾选 HTTPS
  4. 点击 「确定」,即可在「此电脑」中看到映射的磁盘。

8.3 macOS 客户端

  1. 打开 「访达」
  2. 顶部菜单栏 → 「前往」「连接服务器」
  3. 输入:https://你的域名/
  4. 点击连接,输入用户名和密码

8.4 手机客户端

  • Android:ES文件浏览器、Solid Explorer
  • iOS:Documents、FileExplorer

九、常见问题与解决方案

问题现象 可能原因 解决方法
405 Not Allowed Nginx 缺少 WebDAV 模块或配置缺失 确认 dav_methodsdav_ext_methods 已正确配置;检查是否缺少 dav-ext 模块
500 Internal Server Error 密码文件格式错误或路径不对 使用 openssl passwd 重新生成密码文件,确保格式为 用户名:加密密码
401 Unauthorized 用户名/密码错误或客户端填写方式不对 curl 测试验证密码是否正确;检查客户端是否在地址中误写了 https://
Connection refused 端口未放行 检查云服务商安全组 + 宝塔「安全」菜单,确保 80/443 端口已放行
证书申请失败 NXDOMAIN 域名未解析 去域名解析商添加 A 记录,指向服务器 IP
conflicting server name 警告 多个站点绑定了同一域名 可在宝塔中检查其他站点配置,无影响可忽略

十、安全提醒

  1. 使用复杂密码:建议使用大小写字母 + 数字 + 特殊字符的组合
  2. 启用 HTTPS:本教程已配置 SSL 证书,传输过程加密,防止密码被窃听
  3. 定期更新证书:Let's Encrypt 证书有效期为 90 天,宝塔面板会自动续期
  4. 限制访问 IP(可选):如果只有自己使用,可在 Nginx 配置中添加 allow 你的IP; deny all; 限制来源 IP

附录:常用命令速查

# 检查 WebDAV 模块是否安装
nginx -V 2>&1 | grep -o with-http_dav_module

# 检查 dav-ext 扩展模块
nginx -V 2>&1 | grep "dav-ext"

# 测试 Nginx 配置语法
nginx -t

# 重载 Nginx 配置
nginx -s reload

# 重新生成密码文件
openssl passwd -apr1 新密码 > /tmp/pwd.txt
echo "用户名:$(cat /tmp/pwd.txt)" > /www/wwwroot/你的站点目录/.htpasswd

# 验证 WebDAV 服务
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"

# 上传测试文件
curl -k -u 用户名:密码 -T /tmp/hello.txt https://你的域名/hello.txt

# 查看 Nginx 错误日志
tail -20 /www/wwwlogs/你的域名.error.log

订阅更新
输入邮箱,第一时间接收本站新文章推送。
请先 登录 再评论