由于在Infuse中观看家中Mac mini服务器中的4K HDR内容时发现非常卡顿(视频码率仅12Mbps),于是测速发现,通过SMB协议访问Mac mini服务器中的内容下载速率仅120Mbps。在网上的讨论中发现可能是因为Infuse客户端某些奇怪的兼容性问题,改成WebDAV协议访问可以跑满速度。于是张罗着使用Mac mini作为WebDAV服务器。结果到最后却发现卡顿的原因不仅是因为下载速度差,更是因为Apple TV 4K(A15芯片)无法硬解AV1编码。这点我在搞好WebDAV服务器之后才发现,我说明明速率都到700Mbps了,怎么还是卡呢,后来摸一摸机身滚烫,才发现是视频编码的问题。无论如何,Mac mini作为WebDAV服务器还是很香的,利用macos自带的Apache服务器即可完成。但是网上的文字教程较少,我在b站发现一个说得很好的视频,但是为了今后维护方便,我将这个up主的内容和我如何配置SSL证书的过程写在这里。

macOS自带Apache作为WebDAV服务器

sudo apachectl start
sudo vim /etc/apache2/httpd.conf

httpd.conf 文件中,我们需要取消注释一些行(去除行首#),让Apache加载一些库文件:

LoadModule dav_module libexec/apache2/mod_dav.so
LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so
LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
Include /private/etc/apache2/extra/httpd-dav.conf

接下来我们编辑刚刚引入的httpd-dav.conf 。注意,路径前面的/private 为macOS的路径,/etc实际上是一个软连接,指向/private/etc

sudo vim /etc/apache2/extra/httpd-dav.conf

打开这个文件后,映入眼帘的是一些注释和DavLockDB配置项,根据视频教程,我们这里将其设置在/opt/webdav/DavLock 下:

DavLockDB "/opt/webdav/DavLock"

接下来,在该文件中很容易找到类似这样的结构:

Alias /uploads "/usr/uploads"

<Directory "/usr/uploads">
    Dav On

    AuthType Basic
    AuthName "Private WebDAV"
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/usr/user.passwd" DAV-upload admin
    AuthBasicProvider file
    AuthUserFile "/opt/webdav/basic.passwd"
    Require valid-user

    # Allow universal read-access, but writes are restricted
    # to the admin user.
    <RequireAny>
        Require method GET POST OPTIONS
        Require user admin
    </RequireAny>
</Directory>

这里Alias代表将哪个web路径映射到哪个本地路径。<RequireAny> 定义了允许的操作;我们暂时不控制权限,可以注释掉这部分。根据注释我们可以看到认证方式是要使用一个密码文件,可以用htdigest命令来生成。这里我们将密码文件存放在/opt/webdav/user.password。注意,AuthNamehtdigest命令中的第二个参数要对应。这个结构可以多次重复来定义多个WebDAV路径。例如,我将配置文件修改为:

Alias /SD "/Volumes/PortableSSD"

<Directory "/Volumes/PortableSSD">
    Dav On

    AuthType Basic
    AuthName "Private WebDAV"
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/usr/user.passwd" DAV-upload admin
    AuthBasicProvider file
    AuthUserFile "/opt/webdav/basic.passwd"
    Require valid-user

    # Allow universal read-access, but writes are restricted
    # to the admin user.
#    <RequireAny>
#        Require method GET POST OPTIONS
#        Require user admin
#    </RequireAny>
</Directory>

Alias /WDHDD "/Volumes/Western Digital/"

<Directory "/Volumes/Western Digital/">
    Dav On

    AuthType Basic
    AuthName "Private WebDAV"
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/usr/user.passwd" DAV-upload admin
    AuthBasicProvider file
    AuthUserFile "/opt/webdav/basic.passwd"
    Require valid-user

    # Allow universal read-access, but writes are restricted
    # to the admin user.
#    <RequireAny>
#        Require method GET POST OPTIONS
#        Require user admin
#    </RequireAny>
</Directory>

是否还记得刚才设置的DavLockDB路径?如果修改了它,则需要创建这个路径并修改相应权限:

sudo mkdir -p /opt/webdav
sudo chown _www:_www/opt/webdav

这里,_www 是 macOS 系统里专门用于Web 服务的内置用户。接下来我们创建密码文件:

sudo htpasswd -c /opt/webdav/basic.passwd infuse
sudo chown root:_www /opt/webdav/basic.passwd
sudo chmod 640 /opt/webdav/basic.passwd

注意,htpasswd命令也可以设置参数与配置文件中的AuthName对应,这里没有设置这个参数,可以自由修改;infuse将会是后续用于登录的用户名。

接下来我们为这些系统服务赋予完全磁盘访问权限:在设置-隐私权与安全中选择完全磁盘访问权限,授予httpdhtdigest两个程序权限;两个程序均在/usr/sbin/目录下,按Command+Shift+G可以调出输入路径的对话框。

最后,我们重载Apache配置:

apachectl configtest
apachectl graceful

这时已经可以用http协议测试访问了,但我们最好再配置https。

配置SSL

由于443端口已做他用,这里我们配置Apache服务器监听9443端口,并配置SSL。

首先启用一些SSL相关模块,编辑主配置:

sudo vim /etc/apache2/httpd.conf

确保以下模块被启用(去掉前面的 #):

LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

再确保包含了 httpd-ssl.conf

Include /private/etc/apache2/extra/httpd-ssl.conf

再修改SSL配置文件:

sudo vim /etc/apache2/extra/httpd-ssl.conf

首先修改监听端口:

# When we also provide SSL we have to listen to the
# standard HTTP port (see above) and to the HTTPS port
#
Listen 9443

找到<VirtualHost> 标签,并修改其端口和网站网址,例如:

<VirtualHost _default_:9443>

#   General setup for the virtual host
DocumentRoot "/Library/WebServer/Documents"
ServerName nas.ipangbo.cn:9443
ServerAdmin [email protected]
ErrorLog "/private/var/log/apache2/error_log"
TransferLog "/private/var/log/apache2/access_log"

这里也定义了错误日志的位置,若有问题可到此路径查看日志来分析。

找到SSLCertificateFile 行,取消注释并将路径改为证书地址,例如:

SSLCertificateFile "/Users/ipangbo/.ssh/server.crt"

就在下面几行,找到SSLCertificateKeyFile行,取消注释并将路径改为密钥地址,例如:

SSLCertificateKeyFile "/Users/ipangbo/.ssh/server.key"

重载Apache配置:

apachectl configtest
apachectl graceful

证书可以选用Let's Encrypt的,关于其如何自动申请及下发,下篇文章会讲到。