默认安装的 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,没想到就成了。