分类
Web

文件共享之WebDAV

做一个文件服务器,常用的共享方式有:NFS、Samba、FTP、SFTP、WebDAV。对比这几种方式:

NFS:Linux默认文件共享协议,适合在Linux系统,跨平台使用很不方便。排除。

Samba:Windows文件共享协议,跨平台好,在Windows资源管理器内就能打开使用。但是要用在公网上不方便。排除。

FTP:协议不安全,有主动模式和被动模式,在公网上穿透也不方便。排除。

SFTP:基于SSH,一般用它做共享文件服务器很少,需要安装额外工具软件,性能不如Samba和NFS。排除。

WebDAV:一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

综上,WebDAV是最好适合我的选择。主流Nginx、Apache等Web服务器都支持WebDAV。因为Web服务器本来就在公网上,基于WebDAV共享,用户可以用浏览器或专用工具,通过80端口直接访问。

Nginx开启WebDAV

在Nginx中实现WebDAV需要安装 libnginx-mod-http-dav-ext 模块。以下是Nginx的配置:

server {
        listen 80;
        listen [::]:80;

        server_name dav.wangzhengzhen.com;
        auth_basic "Authorized Users Only";
        auth_basic_user_file /data/www/.htpasswd;

        location / {
                root /data/storage;
                client_body_temp_path /var/temp;
                dav_methods PUT DELETE MKCOL COPY MOVE;
                dav_ext_methods PROPFIND OPTIONS;
                create_full_put_path on;
                client_max_body_size 10G;
        }
}

server {
        listen 443;
        listen [::]:443;
        server_name dav.wangzhengzhen.com;

        ssl on;
        ssl_certificate /data/www/cert/dav.wangzhengzhen.com_nginx/cert.pem;
        ssl_certificate_key /data/www/cert/dav.wangzhengzhen.com_nginx/cert.key;
        ssl_session_timeout 5m;
        ssl_protocols SSLv2 SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

        location / {
                root /data/storage;
                client_body_temp_path /var/temp;
                dav_methods PUT DELETE MKCOL COPY MOVE;
                dav_ext_methods PROPFIND OPTIONS;
                create_full_put_path on;
                client_max_body_size 10G;
        }

}

配置了http和https,.htpasswd是登录WebDAV的用户密码文件。

创建用户使用htpasswd工具,如:

htpasswd -c /etc/nginx/.htpasswd webdav

输入密码,生成文件内容:

如果需要创建多个用户,注意去掉 -c 参数,防止生成文件覆盖。

htpasswd是apache的工具,如果使用nginx,可以单独安装该工具而不安装整个apache。在Ubuntu中使用 sudo apt install apache2-utils 安装。

Apache开启WebDAV

据说Apache的WebDAV支持比Nginx要好,在Apache下配置WebDAV,需要打开以下模块:

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so

配置如下:

<VirtualHost *:80>
	ServerName dav.wangzhengzhen.com
	DocumentRoot D:/WebDAV
	<Directory "D:/WebDAV">
		Options Indexes FollowSymLinks
		AllowOverride None
		Dav on
		AuthType Basic
		AuthName "WebDAV Upload"
		AuthUserFile conf/.htpasswd
		AuthBasicProvider file
		Require user webdav
	</Directory>
</VirtualHost>

<VirtualHost *:443>
	ServerName dav.wangzhengzhen.com
	DocumentRoot D:/WebDAV
	<Directory "D:/WebDAV">
		Options Indexes FollowSymLinks
		AllowOverride None
		Dav on
		AuthType Basic
		AuthName "WebDAV Upload"
		AuthUserFile conf/.htpasswd
		AuthBasicProvider file
		Require user webdav
	</Directory>
#	Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
	# 添加 SSL 协议支持协议,去掉不安全的协议
	SSLProtocol all -SSLv2 -SSLv3
	# 修改加密套件如下
	SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
	SSLHonorCipherOrder on
	# 证书公钥配置
	SSLCertificateFile cert/dav.wangzhengzhen.com_apache/public.crt
	# 证书私钥配置
	SSLCertificateKeyFile cert/dav.wangzhengzhen.com_apache/cert.key
	# 证书链配置,如果该属性开头有 '#'字符,请删除掉
	SSLCertificateChainFile cert/dav.wangzhengzhen.com_apache/chain.crt
</VirtualHost>

用户密码文件和Nginx一样,用htpasswd生成。

最后推荐一个工源工具:RaiDrive

RaiDrive 是一款能够将一些网盘映射为本地网络磁盘的工具,支持 Google Drive、Google Photos、Dropbox、OneDrive、FTP、SFTP、WebDAV。

这样就能像访问本地磁盘一样操作共享的文件了。

发表评论

电子邮件地址不会被公开。