macOS上基于httpd-dav搭建WebDav服务

时间:2024-03-20 14:54:46

文章目录

    • 配置 Apache httpd
      • 修改 ServerName
      • 启动验证 httpd 服务
      • 启用 Dav 扩展服务配置
    • 配置 httpd 扩展 Dav 服务
      • 设置共享目录文件夹
      • 配置 DavLockDB 目录
      • 创建 WebDAV 访客用户
    • httpd-dav.conf 主要改动部分
      • Basic
      • Digest
      • 共享多个目录
    • 授予 httpd 完全磁盘访问权限
    • 验证更新配置重启Apache Httpd
    • 局域网连接验证WebDAV服务
    • curl 命令行访问操作 WebDAV
    • linux 挂载 WebDAV 云盘
    • 参考

在局域网中,要想共享或访问 macOS 机器上的文件,可以通过文件共享、屏幕共享或 远程登录 这几种方式:

  1. FS(SMB): Set up file sharing on MacControl access to your Public folder on Mac
  2. SSH+SFTP: Allow a remote computer to access your Mac
  3. Screen Sharing(VNC): Turn Mac screen sharing on or offShare the screen of another Mac
  4. RD: Enable remote management for Remote Desktop

FS 模式一般默认开放给 everyone 只读,可以以 Guest User 身份免登录访问,但是一旦涉及到要开放写权限,会涉及到系统账户分级分组管理和ACL权限控制和分配粒度问题。局域网内怎么样部署简易轻量的共享同步存储系统呢?

在多终端设备时代,很多人都购买了在线网络云盘服务,或者自己动手DIY搭建部署家庭局域网NAS私有云服务器,作为家里的数据和影音中心,方便文件共享和存储备份同步。另一个日益增长的需求就是分布式协作,Google文档、腾讯文档等产品就是解决这类问题的在线协同编辑的办公软件。

早在1996年,加州大学尔湾分校博士毕业生Jim Whitehead就与W3C共同主办了两场会议讨论了万维网上的分布式创作问题,并成立了WebDAV工作小组。

WebDAV 是 Web-based Distributed Authoring and Versioning 的缩写,即基于Web的分布式编写和版本控制。它是对 HTTP 的扩展,为用户在服务器上创建、更改和移动文档提供了一个框架,方便用户间协同编辑和管理存储在万维网服务器上的文档。

因为基于HTTP,WebDAV 在广域网上共享文件有天然的优势,移动端文件管理APP大多都支持WebDAV协议,使用HTTPS还能保安全性。微软的Office和自家Sharepoint服务器通信,苹果的iWork套件也是基于WebDAV。Apache和Nginx都扩展支持WebDAV,可作为WebDAV文件共享服务器软件。

本文记录了在 macOS 上基于内置的 Apache Httpd 搭建 WebDAV 服务的步骤流程,以供备忘和参考。

配置 Apache httpd

Apache Httpd 配置文件:/etc/apache2/httpd.conf。

$ cd /etc/apache2/
//  备份文件,以防不测
$ sudo cp httpd.conf httpd.conf.bak
$ sudo vim httpd.conf

默认的文档服务目录:

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">

修改 ServerName

通过以下命令获取主机名:

  • hostname
  • scutil --get ComputerName
  • scutil --get LocalHostName

搜索 ServerName 注释行,设置与主机名称一致

ServerName mbpa1398:80

启动验证 httpd 服务

由于尚未配置 webdav 扩展服务,暂时先不管 webDAV 服务,先把 httpd server 跑起来。

请检查 wfsctl status 是否为禁用状态:

$ sudo wfsctl status
disabled

如果否,请先执行 sudo wfsctl stop 停止,否则可能会有端口冲突等问题导致后续无法访问。


执行 sudo apachectl -k start 启动 Apache Httpd 服务,然后在本地命令行输入 curl localhost,正常应返回 DocumentRoot 下的 index.html.en 页面:

<html><body><h1>It works!</h1></body></html>

或在浏览器输入 http://localhosthttp://mbpa1398.local 看看是否正常输出 It works!

Stopping and Restarting Apache HTTP Server - Apache HTTP Server Version 2.4

# 停止内置 Apache 方法
sudo apachectl -k stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

启用 Dav 扩展服务配置

移除以下配置文件中 5 行行首的注释:

 92 #LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
165 #LoadModule dav_module libexec/apache2/mod_dav.so
176 #LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
177 #LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so

533 #Include /private/etc/apache2/extra/httpd-dav.conf
  1. LoadModule 加载 mod_dav 相关的三个动态库和用于 digest auth 验证的动态库。
  2. Include 包含(引入)dav 扩展服务配置(extra/httpd-dav.conf)。

如果使用默认的认证方式 AuthType Digest,则需加载 mod_auth_digest.so。
如果改为 Basic,默认已经加载了 mod_auth_basic.so,无需加载 mod_auth_digest.so。

配置 httpd 扩展 Dav 服务

Httpd 的 Dav 扩展服务配置文件:/etc/apache2/extra/httpd-dav.conf。

$ cd extra
# 备份配置文件
$ sudo cp httpd-dav.conf httpd-dav.conf.bak
# 编辑配置文件
$ sudo vim httpd-dav.conf

设置共享目录文件夹

macOS 开启 Apache 并定义网站文件放在 /Users/你的用户名/Sites 目录中。

在你的 Sites 目录下新建 DAVNAS 目录用作 WebDAV 服务目录。

第19行指定共享服务目录:/Users/faner/Sites/DAVNAS。
第17行设置 alias 名字为 /webdav,为后续访问 URL 的根路径。

 17 Alias /webdav "/Users/faner/Sites/DAVNAS"
 18
 19 <Directory "/Users/faner/Sites/DAVNAS">

httpd.conf 中指定了运行 httpd daemon 进程的用户和组:

User _www
Group _www

macOS 下 mkdir/touch 新创建的文件(夹),默认对 staff 工作组和 everyone 都开放了 Read Only 权限。

客户端通过 HTTP Basic/Digest 认证访问 web 服务,运行 httpd 服务的 _www._www 用户作为 everyone,拥有对 Directory 目录的只读浏览权限。

想要写共享的 Directory 目录,需要将该目录更改为 _www._www 用户组名下。调用 chown 命令即可:

chown -R _www:_www /Users/faner/Sites/DAVNAS

配置 DavLockDB 目录

创建 /opt/webdav/var 目录:

$ sudo mkdir -p /opt/webdav/var
# -R?
$ sudo chown _www:_www /opt/webdav/var

修改 httpd-dav.conf 第 15 行的 DavLockDB 路径配置:

# 15 DavLockDB "/usr/var/DavLock"
15 DavLockDB /opt/webdav/var/DavLock

创建 WebDAV 访客用户

新建存储密码的文件 user.passwd,并修改所属的用户和组。

$ sudo touch /opt/webdav/user.passwd
$ sudo chown _www:_www /opt/webdav/user.passwd

紧接着,为 webdav 域新增用户 username。

如果 AuthType 是 Digest,执行 htdigest 命令:

$ sudo htdigest -c /opt/webdav/user.passwd webdav $username

如果 AuthType 改为了 Basic,则执行 htpasswd 命令:

$ sudo htpasswd -c /opt/webdav/user.passwd $username

其中, -c 选项将 truncate 已存在的密码文件。

根据提示,为新增的用户(username)设置密码并确认。

可以提前创建多个账号,分配给不同的局域网访客用户。

httpd-dav.conf 主要改动部分

Basic

  • 改:DavLockDB
  • 改:AuthName
  • 改:AuthUserFile
  • 注:AuthDigestProvider
15 DavLockDB "/opt/webdav/var/DavLock"
16
17 Alias /webdav "/Users/faner/Sites/DAVNAS"
18
19 <Directory "/Users/faner/Sites/DAVNAS">
20     Dav On
21
22     AuthType Basic
23     AuthName webdav
24     # You can use the htdigest program to create the password database:
25     #   htdigest -c "/usr/user.passwd" $AuthName $username
26     AuthUserFile "/opt/webdav/user.passwd"
27     # AuthDigestProvider file
29
30     # Allow universal read-access, but writes are restricted
31     # to the admin user.
32     <RequireAny>
33        Require method GET POST OPTIONS
34        Require user $username
35    </RequireAny>
36 </Directory>

Digest

  • 改:DavLockDB
  • 改:AuthName
  • 改:AuthUserFile
  • 增:Require valid-user
  • 注:<RequireAny>…</RequireAny>
15 DavLockDB "/opt/webdav/var/DavLock"
16
17 Alias /webdav "/Users/faner/Sites/DAVNAS"
18
19 \<Directory "/Users/faner/Sites/DAVNAS">
20     Dav On
21
22     AuthType Digest
23     AuthName webdav
24     # You can use the htdigest program to create the password database:
25     #   htdigest -c "/usr/user.passwd" DAV-upload admin
26     AuthUserFile "/opt/webdav/user.passwd"
27     Require valid-user
28     AuthDigestProvider file
29
30     # Allow universal read-access, but writes are restricted
31     # to the admin user.
32 #    \<RequireAny>
33 #        Require method GET POST OPTIONS
34 #        Require user admin
35 #    \</RequireAny>
36 \</Directory>

共享多个目录

建议把要共享的内容放在一个共享目录(DAVNAS),然后通过 /webdav 访问。

如果有多个共享目录,可以复制 Alias、Directory,建立多组 URL 路径映射。

Alias /webdav1 "/Users/faner/Sites/DAVNAS1"

<Directory "/Users/faner/Sites/DAVNAS1">
    Dav On
    # Dav access control
</Directory>

Alias /webdav2 "/Users/faner/Sites/DAVNAS2"

<Directory "/Users/faner/Sites/DAVNAS2">
    Dav On
    # Dav access control
</Directory>

这样,后续就可以通过 /webdav1, /webdav2 分别访问不同的共享目录。

授予 httpd 完全磁盘访问权限

将 DAVNAS 共享目录分配给 _www:_www 后,还得给 httpd 相关 daemon 进程分配磁盘访问权限,这样才能读写磁盘文件系统。

打开 macOS 设置(System Settings),隐私与安全性(Privacy & Security),完全磁盘访问权限(Full Disk Access),

点按左下角的 + 号,在打开的访达窗口按 Shift+Command+G 调出路径访问方式,输入 /usr/sbin/httpd 回车,找到 httpd 命令添加。

依此方法,添加 /usr/sbin/htdigest(或 /usr/sbin/htpasswd)。

验证更新配置重启Apache Httpd

执行 apachectl configtest 检查 Apache Httpd 配置文件:如果仅输出一行 Syntax OK 代表配置正确;否则,表示配置有问题,请按提示检查配置文件,也可查看分析问题日志 /var/log/apache2/error_log。

配置文件验证无误后,执行 sudo apachectl graceful 重载配置文件使生效。

最后,重新启动 Apache 服务器:sudo apachectl -k restart

局域网连接验证WebDAV服务

打开本机访达(Finder),按 Command+k 连接服务器,输入 http://mbpa1398.local/webdav/,然后输入在 user.passwd 中配置的账户密码,看看是否可以正常访问。

  • 如果机器名无法解析(unable to resolve host),可以换成局域网 IP 访问:http://192.168.0.100/webdav , 或者考虑在 /etc/hosts 中添加条目:127.0.0.1 mbpa1398.local 。

本机验证通过后,在局域网其他终端(例如 Mac Finder,iPhone PDF expert)上尝试连接 webdav 服务。连接成功后,即可进行简单的多用户协作。

这样,就将 DAVNAS 配置为家庭局域网内的数据中心,支持多设备共享和编辑同步文件。

DAVNAS 目录隶属 _www:_www 用户组,所有用户统一通过 WebDAV 客户形式以 _www 身份对其执行写入操作。

将配置文件 httpd-dav.conf 中的 Directory 配置为外挂硬盘,例如 /Volumes/WDHD,即可变为简陋的 NAS。

有条件的,可以进一步升级支持 HTTPS 安全访问,需要在 httpd.conf 引入 httpd-ssl.conf 并配置加载 ssl 相关模块,还得使用 openssl 创建自签名证书。

如果家里的宽带有分配公网 IP,可以在路由器中配置端口映射,支持外网访问。这样,即使身在外边,也可远程访问家里的 WebDAV 服务。

curl 命令行访问操作 WebDAV

  1. 认证方式可选 --basic--digest,不指定相当于 --anyauth,让 cURL 自动选择。

  2. -u(–user) 后面可只指定用户名 -u $username,将提示输入密码;也可连带指定密码 -u $username:$password

  3. 拉取文件列表(也可指定其他目录,以/结尾):

curl -i --basic -u $username -X PROPFIND http://mba1398.local/webdav/ --upload-file - -H "Depth: 1" <<end
<?xml version="1.0"?>
<a:propfind xmlns:a="DAV:">
<a:prop><a:resourcetype/></a:prop>
</a:propfind>
end
  1. 新建目录
curl -v -u $username -X MKCOL http://mba1398.local/webdav/curltest/
  1. 上传文件(也可在 url 后续接上传后的自定义目标文件名):
curl -v -u $username -T test.txt http://mba1398.local/webdav/curltest/
  1. 移动文件(同目录相当于重命名):
curl -v -u $username -X MOVE http://mba1398.local/webdav/curltest/test.txt --header 'Destination: http://mba1398.local/webdav/curltest/test2.txt'
  1. 复制文件
curl -v -u $username -X COPY http://mba1398.local/webdav/curltest/test2.txt --header 'Destination: http://mba1398.local/webdav/curltest/test3.txt'
  1. 下载文件(或 > test2.txt,重定向 stdout 到文件;-v 是 stderr):
curl -v -u $username http://mba1398.local/webdav/curltest/test3.txt -o test3.txt
  1. 删除文件(夹):
curl -v -u $username -X DELETE http://mba1398.local/webdav/curltest/test3.txt

linux 挂载 WebDAV 云盘

在 Ubuntu 或 CentOS 下可以将 WebDAV 挂载为本地磁盘。

  1. 安装 davfs2:
# Ubuntu
sudo apt-get install davfs2 -y
# CentOS
sudo yum install davfs2 -y
  1. 创建本地挂载点目录:
$ mkdir /mnt/webdav@mbpa1398
  1. 执行 mount 命令挂载 WebDAV:
$ sudo mount -t davfs http://mbpa1398.local/webdav /mnt/webdav@mbpa1398
Please enter the username to authenticate with server
http://mbpa1398.local/webdav or hit enter for none.
  Username: $username
Please enter the password to authenticate user $username with server
http://mbpa1398.local/webdav or hit enter for none.
  Password: $password
  1. 直接编辑 WebDAV 上的文件,然后保存同步:
sudo vim /mnt/webdav@mbpa1398/test/test.c
  1. 用完之后,记得解除挂载:
sudo umount /mnt/webdav@mbpa1398
  1. 可考虑配置开机自动挂载,涉及以下配置文件:

    • davfs2配置文件:/etc/davfs2/davfs2.conf
    • davfs2密码配置:/etc/davfs2/secrets
    • 自动挂载配置文件:/etc/fstab

参考

wiki - WebDAV
网络存储文件共享之 WebDAV
在 Mac mini Server 上配置 WebDAV 文件共享

WEBDAV WITH CURLcurl 测试 webdav学习 WebDav

如何在Ubuntu或CentOS将WebDAV挂载为本地磁盘
Linux 挂载 WEBDAVLinux将WebDAV为本地磁盘