====== 搭建一个简单的 nginx webdav (FreeBSD) ======
===== 功能简介 =====
* 基于FreeBSD ports的nginx
* 多存储空间
* 用户验证
===== 配置 =====
==== FreeBSD Ports 编译 ====
需要选上 HTTP_DAV, 第三方的 HEADERS_MORE 和 HTTP_DAV_EXT 模块
==== 目录结构 及 变量 ====
请自行修改以下
* /logs/ 日志存储目录
* /ssl/ SSL证书目录
* /webdav/ webdav主目录
* /webdav/root/ webdav多存储目录
* /webdav/auth/ basic auth用户验证 (htpasswd 格式)
* /webdav/temp/ 上传文件的临时目录
* webdav.example.com 为泛域名的基础域名
==== nginx.conf ====
=== 加载模块 ===
load_module /usr/local/libexec/nginx/ngx_http_dav_ext_module.so;
load_module /usr/local/libexec/nginx/ngx_http_headers_more_filter_module.so;
=== vhosts 设置 ===
dav_ext_lock_zone zone=dav:10m;
server {
server_name ~^(.*)\.webdav\.example\.com$;
listen 443 ssl http2;
listen [::]:443 ssl http2;
access_log /logs/webdav.example.com.log;
set $webdav_path /webdav;
set $webdav_root $webdav_path/root/$1;
set $webdav_auth $webdav_path/auth/$1;
root $webdav_root;
if ( !-d $webdav_root ) {
return 404;
}
if ( !-f $webdav_auth ) {
return 404;
}
ssl_certificate /ssl/fullchain.pem;
ssl_certificate_key /ssl/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
charset utf-8;
client_body_temp_path /webdav/temp;
client_max_body_size 0;
create_full_put_path on;
gzip off;
send_timeout 3600;
client_body_timeout 3600;
lingering_timeout 3600;
dav_ext_lock zone=dav;
auth_basic on;
auth_basic_user_file $webdav_auth;
location / {
dav_access user:rw group:rw all:r;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
set $dest $http_destination;
if (-d $request_filename) {
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
if ($request_method ~ (MOVE|COPY)) {
more_set_input_headers 'Destination: $dest';
}
if ($request_method = MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
if ($request_method = PROPPATCH) {
add_header Content-Type 'text/xml';
return 207 'HTTP/1.1 200 OK';
}
}
}
=== 解读 ===
访问 https://a.webdav.example.com, 将访问 /webdav/root/a/ 下的存储空间, 使用 /webdav/auth/a 文件为用户验证文件.
===== 已知问题 =====
==== Windows ====
* 添加 webdav 路径时, 不管由于任何错误失败后, 要等待一段时间才能重试, 否则一直失败. 解决方案就是等一阵子. 可以尝试重启 webclient 服务
* 默认文件限制为 50000000 字节, 对大于这个的文件下载会报 0x800700DF 错误. 解决方法: 修改注册表, 路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters 里面的 FileSizeLimitInBytes 值为十进制 4294967295 (默认值 50000000). 修改后重启系统或重启 webclient 服务
{{tag>nginx webdav}}