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

文章目录

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

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

  1. FS(SMB): Set up file sharing on Mac,Control 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 off,Share the screen of another Mac。
  4. RD: Enable remote management for Remote Desktop

以上几种方式,基本都涉及到复杂的分级账户和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://localhost 或 http://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.so533 #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

设置共享目录文件夹

第19行指定共享服务目录:/Users/faner/Public/DAVNAS。

第17行设置 alias 名字为 /webdav,这个为后续访问 URL 的根路径。

 17 Alias /webdav "/Users/faner/Public/DAVNAS"1819 <Directory "/Users/faner/Public/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/Public/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/Public/DAVNAS"
18
19 <Directory "/Users/faner/Public/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/Public/DAVNAS"
18
19 \<Directory "/Users/faner/Public/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/Public/DAVNAS1"<Directory "/Users/faner/Public/DAVNAS1">Dav On# Dav access control
</Directory>Alias /webdav2 "/Users/faner/Public/DAVNAS2"<Directory "/Users/faner/Public/DAVNAS2">Dav On# Dav access control
</Directory>

这样,后续就可以通过 http://192.168.0.100/webdav1, http://192.168.0.100/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://192.168.0.100/webdav 或 http://mbpa1398.local/webdav/ ,输入在 user.passwd 中配置的账户密码,看看是否可以正常访问。

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

这样,就可以将 DAVNAS 作为家庭局域网内的简陋 NAS,支持多设备共享和编辑同步文件。

需要注意的是,DAVNAS 目录隶属 _www:_www 用户组,所有用户请统一通过 WebDAV 客户形式以 _www 身份对其进行访存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自适应日落动态卡通动画404页面模板

源码介绍 自适应日落动态卡通动画404页面模板&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 自适应日落动态卡通动画404页面模板

Java高级互联网架构师之路:排查当前JVM错误的步骤

程序 这个程序是有问题的,我们通过一些命令来分析这个程序究竟是哪里出了问题。首先把当前的程序通过SSH工具传输到centos系统中,之后我们就可以在linux环境下编译和执行。 注意一点:上面类的名字是Z,但是在linux环境下,我们将其改为了AA,并且文件名改为了AA,所以文章下…

常用图像滤波器,图像增强

滤波器 滤波器在图像处理中有各种各样的应用&#xff0c;它们可以用于去除噪声、平滑图像、增强图像特征等。以下是一些常见的滤波器及其主要应用&#xff1a; 均值滤波器&#xff08;Mean Filter&#xff09;&#xff1a; 用于去除高斯噪声或均匀噪声。 平滑图像&#xff0…

掌握Go语言:深入理解Go语言中的数组和切片,灵活处理数据的利器(16)

Go语言中的数组和切片是常用的集合类型&#xff0c;它们在处理数据时提供了不同的特性和灵活性。本文将深入探讨数组和切片的使用方法、特性、实例以及应用场景。 1. 数组和切片简介 在Go语言中&#xff0c;数组和切片都是集合类的类型&#xff0c;用于存储相同类型的元素。它…

Python实战:Python内置函数与常用标准库介绍

Python是一种广泛使用的高级编程语言&#xff0c;其内置函数和标准库为开发者提供了丰富的功能。本文将详细介绍Python的内置函数和常用标准库&#xff0c;包括数据类型、输入输出、文件操作、网络编程等。 1. 引言 Python的内置函数和标准库为开发者提供了丰富的功能&#x…

计算机网络----计算机网络的基础

目录 一.计算机网络的相关概念 二.计算机网络的功能 三.计算机网络的发展 四.计算机网络的组成 五.计算机网络的分类 六.计算机的性能指标 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时延RTT 7.利用率 七.计算机的分层结构 八.ISO/OSI参考模型 九.OSI…

2024云服务器安装MySQL,连接Navicat保姆级教程

文章目录 yum方式安装指定版本mysqlNavicat连接mysql&#xff0c;并建表 yum方式安装指定版本mysql 使用绝对路径cd /etc/yum.repos.d/进入该目录使用文本编辑器&#xff08;如 vim、nano 或 gedit&#xff09;创建 mysql57-community.repo 文件&#xff0c;在编辑页面粘贴下方…

软考80-上午题-【面向对象技术3-设计模式】-结构型设计模式03

一、外观模式 1-1、意图 为子系统中的一组接口提供一个一致的界面。 Facade 模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 1-2、结构 Facade 知道哪些子系统类负责处理请求&#xff1a;将客户的请求代理给适当的子系统对象。Subsvstem classes …

Ansible playbook格式 语法 Ansible playbook格式入门演示 基础了解

目录 Ansible playbook格式简介实例运行结果 Ansible playbook格式简介 playbook由YMAL语言编写。YAML( /ˈjməl/ )参考了其他多种语言&#xff0c;包括&#xff1a;XML、C语言、Python、Perl以及电子邮件格式RFC2822&#xff0c;Clark Evans在2001年5月在首次发表了这种语言…

macOS 安装 NetLogo 6.4.0

netlogo 下载地址 NetLogo-6.4.0.dmg参考 netlogo 官网

vue3之带参数的动态路由

在应用中&#xff0c;可以使用<router-link> 内置组件或 $router.push 方法来导航到带参数的路由。 定义路由 // 引入 Vue 和 Vue Router import { createRouter, createWebHistory } from vue-router; // 引入组件 import Home from ../views/Home.vue; import …

C#,图论与图算法,图(Graph)的数据结构设计与源代码

因为后面即将发布的大量有关“图”的算法与源代码都需要用到下面的这些基础数据&#xff0c;为避免大家去下载&#xff0c;特意先发布于此。 一、图&#xff08;Graph&#xff09;的基础知识 图&#xff08;Graph&#xff09;是一组对象的图示&#xff0c;其中一些对象对通过链…

STM32(TIM定时器中断)

理论知识 定时器定时中断 接线图 定时器工作配置步骤 定时中断和内外时钟源选择 定时器中需要使用的函数 程序实现效果&#xff1a; void TIM_DeInit(TIM_TypeDef* TIMx); **// 恢复定时器的缺省配置**void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM…

【C++】每日一题 228 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

SeAndroid 安全策略机制

seAndroid 是 Android 系统中 SELinux&#xff08;Security-Enhanced Linux&#xff09;的实现&#xff0c;它为 Android 提供了强制访问控制&#xff08;MAC&#xff09;机制。在 seAndroid 中&#xff0c;策略规则定义了不同进程和文件之间的交互方式&#xff0c;以确保系统的…

数据可视化-ECharts Html项目实战(2)

在之前的文章中&#xff0c;我们学习了如何创建简单的折线图&#xff0c;条形图&#xff0c;柱形图并实现动态触发&#xff0c;最大最小平均值。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下…

波奇学Linux:线程安全和自选锁和读写锁

STL不是线程安全的 单例模式的线程安全 自选锁&#xff1a;当线程申请锁失败时&#xff0c;不是挂起&#xff0c;而是一直申请 挂起等待锁 &#xff1a;当线程申请锁失败时&#xff0c;把锁挂起 一般临界区时间短的适合自选锁&#xff0c;长的适合挂起等待锁

Unity的AssetBundle资源运行内存管理的再次深入思考

大家好&#xff0c;我是阿赵。   这篇文章我想写了很久&#xff0c;是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码&#xff0c;只是分享思路&#xff0c;思路不一定正确&#xff0c;欢迎讨论。   对于Unity引擎的资源内存管理&#xff0c;我…

Visual Studio项目模板的创建与使用

Visual Studio项目模板的创建、使用、删除 创建模板项目模板的使用模板的删除 创建模板 点击项目&#xff0c;点击导出模板 选择你要创建哪个项目的项目模板&#xff0c;点击下一步 输入你的模板名称并添加模板说明&#xff0c;方便记忆 项目模板的使用 点击创建新项目 输入刚刚…

[长城杯 2021 院校组]funny_js

[长城杯 2021 院校组]funny_js 审题 根据题名提示为js&#xff0c;再在ida中查看&#xff0c;基本可以确定为quickjs题 QuickJS 是一个快速、灵活且易于嵌入的 JavaScript 引擎&#xff0c;适用于需要在资源受限环境下运行 JavaScript 代码的场景。 工具准备 来到Linux&…