服务器配置WebDAV

橘子 发布于 9 小时前 31 次阅读


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_methodscreate_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;
  • 注意看是否有中文字符乱码。