Linux Docker 搭建 Webdav 并使用 Nginx 反代


默认安装的 Nginx 不支持 webdav,本文使用 docker 安装 webdav,然后使用 Nginx 进行反代启用 SSL

以 lnmp 一键包为例,重新编译 Nginx

重新编译 Nginx

重新编译 Nginx,添加 headers-more-nginx-module

这个模块主要是为了解决反代后不能上传、新建、重命名文件及文件夹等问题

首先下载模块:

cd lnmp1.8/src
git clone https://github.com/openresty/headers-more-nginx-module

然后修改 lnmp.conf 文件:

cd ..
nano lnmp.conf

修改 Nginx_Modules_Options='' 为:

Nginx_Modules_Options='--add-module=/root/lnmp1.8/src/headers-more-nginx-module'

最后运行:

./upgrade.sh nginx

输入原来的 nginx 版本号进行重新编译。

等待一两分钟即可。

安装 Docker 和 docker-compose

使用一键脚本安装即可,先安装 docker :

curl -fsSL https://get.docker.com | bash -s docker

然后安装 docker-compose:

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

搭建 webdav

首先新建一个目录,用来存放 docker-compose.yml

mkdir -p /data/webdav #按自己实际情况创建

创建 docker-compose.yml:

nano /data/webdav/docker-compose.yml

写入如下内容:

version: '3'
services:
  webdav:
    image: bytemark/webdav
    restart: always
    ports:
      - "8110:80" 
    environment:
      AUTH_TYPE: Basic
      USERNAME: uud
      PASSWORD: me
    volumes:
      - /data/webdav/Joplin:/var/lib/dav

其中,ports 中的 8110 可按需修改为其他端口,USERNAME 和 PASSWORD 就是账号密码,自行修改

volumes 中的 /data/webdav/Joplin,修改为你用于存放 webdav 数据的目录

编写好之后,保存退出,运行镜像:

docker-compose up -d

Nginx 反代 webdav

反代 webdav 跟一般反代不太一样,需要添加一些额外配置

否则,反代后的 webdav 会遇到不能上传、新建、重命名文件及文件夹等问题

还是以 lnmp 为例

添加域名部分就不说

直接说反代部分

nano /usr/local/nginx/conf/rewrite/webdav.conf

写入以下内容:

location / {
    # 解决webdav不能创建文件夹问题
    if ($request_method = MKCOL) {
        rewrite ^(.*[^/])$ $1/ break;
    }

    # 解决webdav不能重命名问题
    if (-d $request_filename) {
        rewrite ^(.*[^/])$ $1/;
        set $webdav_dest $webdav_dest/;
        more_set_input_headers 'Destination: $webdav_dest';
    }

    # 解决webdav不能复制、移动文件问题
    if ($request_method ~ (MOVE|COPY)) {
        more_set_input_headers 'Destination: $webdav_dest';
    }

    proxy_pass http://127.0.0.1:8110;
    proxy_redirect $host/ $http_host/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
}

其中http://127.0.0.1:8110 端口修改为你 docker-compose.yml 里的端口

修改域名配置文件:

nano /usr/local/nginx/conf/vhost/你的域名.conf

修改后:

server
    {
        listen 80;
        #listen [::]:80;
        server_name webdav.oooo.com ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/webdav.oooo.com;

        include rewrite/none.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

        access_log  /home/wwwlogs/webdav.oooo.com.log;
    }

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name webdav.oooo.com ;
        charset utf-8;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/webdav.oooo.com;

        ssl_certificate /usr/local/nginx/conf/ssl/webdav.oooo.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/webdav.oooo.com/webdav.oooo.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        client_max_body_size 10G;
        include rewrite/webdav.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        
        include enable-php.conf;
        access_log  /home/wwwlogs/webdav.oooo.com.log;
    }

主要是修改 include rewrite/webdav.conf; 添加 charset utf-8;

保存退出,nginx -t 测试 OK,lnmp nginx reload 重载配置

搭建完毕。

后话

之所以搭建 webdav 是因为想使用笔记软件 Joplin 的同步功能,想同步到自己的 vps

一开始是没有使用 docker 搭建的,直接重新编译 nginx 启用 nginx-dav-ext-module 搭建。但是搭建后,Joplin 无法连接,总是提示 Unknown error 2 (403)

查了资料也没看到有什么解决方法,于是就试了下 docker,没想到就成了。

声明:Vamev|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Linux Docker 搭建 Webdav 并使用 Nginx 反代


Vamev Drive 家庭影院资源库