Mac mini作为WebDAV服务器
由于在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。注意,AuthName和htdigest命令中的第二个参数要对应。这个结构可以多次重复来定义多个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将会是后续用于登录的用户名。
接下来我们为这些系统服务赋予完全磁盘访问权限:在设置-隐私权与安全中选择完全磁盘访问权限,授予httpd和htdigest两个程序权限;两个程序均在/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的,关于其如何自动申请及下发,下篇文章会讲到。