nginx 配置 WebDav

最近毕设或是研究都看了很多论文,论文看了之后笔者习惯做一些笔记便于回顾,这些工作都是在 Zotero 上完成的,然而 Zotero 免费提供的云服务用来进行附件同步的话很快就会超出容量,看到 Zotero 支持 WebDav 之后,笔者便计划在自己的服务器上搭建 WebDav 服务来同步管理文献。

nginx 启用基本的 WebDav 只需要在编译配置的时候加上 --with-http_dav_module 即可启用基本的 WebDav 功能,这些基本的功能包括 PUT DELETE MKCOL COPY MOVE 等。然而,笔者希望配置的 WebDav 能够同时支持来自应用(Zotero)的操作,那么基本的 WebDav 功能就不够了。为此,需要额外安装 nginx-dav-ext-module 模块。

一、编译

按照 使用 Fast-CGI cache 优化 Nginx 加速 WordPress 站点 中安装 nginx 的顺序,在 configure 时新增参数:

--add-module=/path/to/nginx-dav-ext-module

(这里是静态模块,如果添加动态模块则换为 --add-dynamic-module),重新编译 nginx 之后安装即可。

二、nginx 配置

笔者为 nginx 分配了一个与博客站点不同的域名,因此在 nginx 中单独使用一个配置文件来描述这个 WebDav 站点,由于WebDav 基于 HTTP 协议,因此同样适用 80 和 443 端口,这里,在未启用 SSL 时,可以先设置配置文件如下:

server {
        listen 80;
        listen [::]:80;

        # webDav 站点的域名
        server_name your.webdav.site.domain;

        # 网站根目录,此处即为访问 webDav 的根目录
        root /webDav/file/directory;

        index index.html index.htm index.nginx-debian.html;

        # nginx 提供的网站认证,与 WebDav 功能无关,非必需
        auth_basic "Authenticated Users";
        auth_basic_user_file /etc/nginx/.credentials.list;

        location / {
               # 启用 WebDav 的一些关键字        
               dav_methods PUT DELETE MKCOL COPY MOVE;
               # 启用 WebDav 的一些扩展关键字用于支持应用访问
               dav_ext_methods PROPFIND OPTIONS;
               # 设置 WebDav 目录下新增文件的默认权限
               dav_access user:rw group:rw all:r;
               # 创建文件夹时自动创建路径上不存在的文件夹
               create_full_put_path  on;
               # 设置报文最大长度便于文件传输,这里为8MB
               client_max_body_size 8m;

               # 让 nginx 自动生成索引页面,避免 403 错误
               autoindex on;
        }
}

一个简单的 WebDav 站点的配置如上,启用 WebDav 最关键的部分即在于 dav_ 开头的三个关键字,它们分别启用了 WebDav 基本与扩展功能,并进行了简单的权限配置,同时要启用 autoindex 来防止 nginx 403 错误。

笔者在配置文件中还添加了用户身份验证, nginx 通过读取认证文件(包含了用户名和密码)来在访问网站时验证客户身份,添加一个用户与密码的方法也很简单:

# 添加一个用户,userName 为用户名
echo -n 'userName:' | sudo tee -a /etc/nginx/.credentials.list
# 设置用户的密码
openssl passwd -apr1 | sudo tee -a /etc/nginx/.credentials.list

三、添加 SSL

目前我们实现的 WebDav 网站可以正常运行了,但是只用了 80 端口,为了实现安全的加密传输,还需要配置 SSL。

配置 SSL 的过程并不需要特别修改 WebDav 的配置,和绝大部分网站配置 SSL 的过程相同,在 nginx 中新增 SSL 配置如下:

server {
        listen 80;
        listen [::]:80;

        server_name your.webdav.site.domain;
        # http 重定向至 https
        rewrite ^(.*) https://$server_name$1 permanent;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name your.webdav.site.domain;

        # 新增的 SSL 配置
        ssl_certificate /path/to/fullchain.pem;
        ssl_certificate_key /path/to/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
        ssl_ecdh_curve secp384r1;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_session_tickets off;

        root /webDav/file/directory;

        index index.html index.htm index.nginx-debian.html;

        auth_basic "Authenticated Users";
        auth_basic_user_file /etc/nginx/.credentials.list;
        location / {
                dav_methods PUT DELETE MKCOL COPY MOVE;
                dav_ext_methods PROPFIND OPTIONS;
                dav_access user:rw group:rw all:r;
                create_full_put_path  on;
                client_max_body_size 8m;

                autoindex on;
        }
}

配置完成后就可以使用了,在 Zotero 客户端输入用户名与密码可以看到提示连接成功,从而方便地同步管理文献。

发表回复

您的电子邮箱地址不会被公开。