一台云服务器windows篇:13、WebDav 服务端

WebDav是个人最简单的私有云盘方式了,无论是部署,还是挂载。

Nginx 的 HTTP Basic 认证与WebDav – 未名 中,确认了 Nginx for Windows 是无法开启WebDav的,只能使用第三方软件来实现了。

hacdias/webdav

一个很简单,很纯粹的全平台 WebDav 服务端工具,正如网站介绍:A simple and standalone WebDAV server.

最新版本是v5.8,下载:Windows X64

配置 config.yml

解压zip包后,在webdav.exe的目录下,创建config.yml文件,内容如下:

YAML
# 修改配置后,要重启 webdav.exe 生效: nssm restart WebDav
address: 0.0.0.0
port: 6065
prefix: /
debug: false
noSniff: false
# 在受信任的代理后面运行
behindProxy: true
# 默认主目录。
directory: D:\WebDavFiles\default
# 默认权限,可以组合的值: C (Create), R (Read), U (Update), D (Delete). 比如:RC
permissions: R
# 默认权限规则,[]代表无,有配置时:规则从最后到第一个应用,与请求匹配的第一个规则,就应用。path始终相对于主目录。
#rules: []
rules:
  - path: /单个文件最大5M.txt
    permissions: R
# 权限规则继承策略:overwrite=覆盖,append=追加
rulesBehavior: overwrite

# 日志:format有console|json,outputs有stderr,或file.log
log:
  format: console
  colors: true
  outputs:
  - D:\Logs\WebDavConsole.log

# CORS 跨域资源共享配置,直接关闭,不用了解。
cors:
  enabled: false
  credentials: true
  allowed_headers:
    - Depth
  allowed_hosts:
    - http://localhost:8181
  allowed_methods:
    - GET
  exposed_headers:
    - Content-Length
    - Content-Range

# 用户列表:为空,则不会进行身份验证。否则,将自动配置基本身份验证。如果将身份验证委托给其他服务,则使用基本身份验证代理用户名,然后使用以下选项禁用 webdav 的密码检查:
# noPassword: true
users:
  - username: admin
    password: admin
    directory: D:\WebDavFiles\liang
    permissions: CRUD
    rules:
      - path: /单个文件最大5M.txt
        permissions: R

# ********************************* 示例 *********************************
#  - username: admin
# 从环境中获取其ENV_USERNAME变量的值
#  - username: "{env}ENV_USERNAME" 
# 使用明文密码示例
#    password: admin
# 使用 webdav.exe bcrypt 生成加密密码示例
#    password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
# 从环境中获取其ENV_PASSWORD变量的值
#    password: "{env}ENV_PASSWORD"
# 可选:用户主目录,覆盖默认主目录,绝对路径
#    directory: D:\Tmp
# 可选:用户权限,覆盖默认权限
#    permissions: CRUD
# 可选:用户权限规则,path: 针对相对路径的权限限制;regex: 针对文件名正则匹配的权限限制;permissions: none/R/C/U/D/组合
#    rules:
# 用户对 {user directory}/some/files 无法访问
#      - path: /some/file
#        permissions: none
# 用户对 {user directory}/public/access 有CRUD权限
#      - path: /public/access/
#        permissions: CRUD
# 用户对 .js文件,有RU权限
#      - regex: "^.+.js$"
#        permissions: RU

运行

方式一:直接在CMD中执行webdav.exe就可了。

方式二:使用 nssm.exe 工具,注册为系统服务运行。

BAT (Batchfile)
@echo off
rem nssm.exe在同一个目录中

call :install WebDav
rem WebDavFiles目录、logDir目录:要有Network Service的NTFS权限。 %~dp0logs C:\inetTmp\RDSLogs
cacls D:\WebDavFiles /t /e /g "NT AUTHORITY\NETWORK SERVICE:F"
cacls %logDir% /t /e /g "NT AUTHORITY\NETWORK SERVICE:F"
cacls %~dp0 /t /e /g "NT AUTHORITY\NETWORK SERVICE:F"
goto batEnd

:install
rem WebDavFiles目录、logDir目录:要有Network Service的NTFS权限。
set logDir=D:\Logs
"%~dp0nssm.exe" install "%1" "%~dp0%1.exe"
"%~dp0nssm.exe" set "%1" DisplayName "%1 Server"
REM "%~dp0nssm.exe" set "%1" Description "%1 Server"
"%~dp0nssm.exe" set "%1" Start SERVICE_AUTO_START
"%~dp0nssm.exe" set "%1" ObjectName NetworkService
"%~dp0nssm.exe" set "%1" Type SERVICE_WIN32_OWN_PROCESS
"%~dp0nssm.exe" set "%1" AppThrottle 1000
"%~dp0nssm.exe" set "%1" AppExit Default Restart
"%~dp0nssm.exe" set "%1" AppRestartDelay 0
"%~dp0nssm.exe" set "%1" AppStdout "%logDir%\%1_out.log"
"%~dp0nssm.exe" set "%1" AppStderr "%logDir%\%1_err.log"
goto :eof

:batEnd
"%~dp0nssm.exe" start WebDav

Nginx 配置

Nginx
        # 上传文件大小上限
        client_max_body_size 5m;
        
        location / {
            proxy_pass http://127.0.0.1:6065;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;

            # Ensure COPY and MOVE commands work.
            set $dest $http_destination;
            if ($http_destination ~ "^$scheme://$host(?<path>(.+))") {
                set $dest /$path;
            }
            proxy_set_header Destination $dest;
        }

rclone serve webdav

Rclone是一个同步工具(只有单向同步测试成功,双向同步在 Windows + S3自建、OneDrive 下没有测试成功。),但通过 rclone serve 命令(下载官方文档中文站文档)可以提供DLNA、FTP、SFTP、HTTP、WebDav、S3、restic’s REST API、NFS等,访问本地文件内容。

rclone.conf 配置文件生成

在终端里,通过 rclone.exe config 交互方式生成此文件;由于访问本地文件系统的配置内容简单,可以直接新建UTF-8文本文件解决,放以下内容:

[Local]
type = local
  1. 如果不是 rclone.exe config file 的位置,需要后续 rclone.exe 命令中,增加 –config %exeDir%\rclone.conf 参数。
  2. 在终端中执行命令,看是否显示C盘的文件夹名称,验证配置:
    • 注意:Local是区分大写的,要与rclone.conf文件中[]内容一模一样。
rclone lsd Local:c:\

htpasswd.conf 身份验证文件生成

在 windows 下使用 htpasswd :

新建UTF-8文本文件,一行一个用户。

不支持按用户,配置各自主目录,所有用户都是在一个目录中。

运行rclone serve webdav

直接在终端中,执行:

rclone serve webdav Local:D:\

如果没有端口被占用,就可以看到日志输出:

2025/09/19 20:41:50 NOTICE: Local file system at //?/D:/: WebDav Server started on [http://127.0.0.1:8080/]

使用 nssm.exe 安装 rclone serve webdav 为 Windows 系统服务

  • 在第11行中:
    • Local:D:\WebDavFiles\ 为WebDav网站的根目录;
    • –addr :8000 为监听IP与端口号,自行修改;
    • 由于会使用Nginx代理,所以不需要指这ca与kay文件。
BAT (Batchfile)
@echo off
rem nssm.exe在同一个目录中

call :install Rclone
rem WebDavFiles目录、logDir目录:要有Network Service的NTFS权限。 %~dp0logs C:\inetTmp\RDSLogs
cacls D:\WebDavFiles /t /e /g "NT AUTHORITY\NETWORK SERVICE:F"
cacls %~dp0 /t /e /g "NT AUTHORITY\NETWORK SERVICE:F"
goto batEnd

:install
"%~dp0nssm.exe" install "%1" "%~dp0%1.exe" "serve webdav Local:D:\WebDavFiles\ --config %~dp0Rclone.conf --copy-links --log-file %~dp0%1.log --etag-hash auto --addr :8000 --htpasswd %~dp0htpasswd.conf"
"%~dp0nssm.exe" set "%1" DisplayName "%1 WebDav Server"
REM "%~dp0nssm.exe" set "%1" Description "%1 Server"
"%~dp0nssm.exe" set "%1" Start SERVICE_AUTO_START
"%~dp0nssm.exe" set "%1" ObjectName NetworkService
"%~dp0nssm.exe" set "%1" Type SERVICE_WIN32_OWN_PROCESS
"%~dp0nssm.exe" set "%1" AppThrottle 1500
"%~dp0nssm.exe" set "%1" AppExit Default Restart
"%~dp0nssm.exe" set "%1" AppRestartDelay 0
"%~dp0nssm.exe" set "%1" AppStdout "%logDir%\%1_out.log"
"%~dp0nssm.exe" set "%1" AppStderr "%logDir%\%1_err.log"
goto :eof

:batEnd
REM "%~dp0nssm.exe" edit Rclone
"%~dp0nssm.exe" start Rclone

Nginx 配置

Nginx
    location / {
        # proxy_request_buffering on(默认):NGINX 会在转发请求前,先将整个请求体读完并缓存在本地。off:NGINX 会 边读取请求体边转发到后端,即 流式转发。
        proxy_request_buffering off;
        proxy_pass http://127.0.0.1:8000;

        # 支持 WebSocket 协议
        #proxy_http_version 1.1;
        #proxy_set_header Upgrade $http_upgrade;
        #proxy_set_header Connection "upgrade";

        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #proxy_redirect off;
    }

openList的WebDav服务端

下载:OpenList

openlist.bat

双击后,已启动了就是关闭,没有启动就启动且打开 http://localhost:5244

BAT (Batchfile)
@echo off
rem 与openlist.exe同目录,bat文件名不要改。
set Console=C:\Sysinternals\Console
%Console%\pslist64.exe -nobanner openlist
if %errorlevel% equ 0 (
  %~dpn0.exe stop
) else (
  %Console%\RunHiddenConsole.exe %~dpn0.exe start
  timeout 3 > nul
  start http://localhost:5244
)

开启WebDav服务端

在openList中,支持本地文件系统(存储中选择本机存储)挂载,也支持开启WebDAV client访问。开启方法很简单:

  1. 先在用户中开启webdav读取与管理权限,及其他管理权限(增删改) ;
  2. 再通过 http://localhost:5244/dav/ 访问,如果不成功,重做第1步且重启就可以了。

官方文档:WebDav服务端Nginx代理配置

Nginx配置

Nginx
location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Range $http_range;
  proxy_set_header If-Range $http_if_range;
  proxy_redirect off;
  proxy_pass http://127.0.0.1:5244;
  proxy_http_version 1.1;
  # the max size of file to upload
  client_max_body_size 20000m;
}

开启Ftp/Sftp服务端

openList中也支持开启Ftp/Sftp client访问,开启方法简单:

  1. 先在用户中开启ftp读取与管理,及其他管理权限(增删改);
  2. 再到 data\config.json 中,修改配置开启(见下图);
  3. 后重启,通过 http://localhost:5244/dav/ 访问。

官方文档:Ftp/Sftp服务端S3对像存储

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注