搭建一个 WebDAV 服务器,可以选择不同的服务器软件,比如 Apache、Nginx 或其他开源解决方案。下面我将详细介绍如何在 Ubuntu 上使用 Apache HTTP Server 来搭建 WebDAV 服务器。
1. 安装 Apache 和 WebDAV 模块 首先,确保系统更新并安装 Apache HTTP Server 以及 WebDAV 所需的模块:
1 2 3 4 sudo apt update sudo apt install apache2 sudo a2enmod dav sudo a2enmod dav_fs
2. 配置 WebDAV 目录 接下来,配置一个目录来存储 WebDAV 文件,并在 Apache 中启用该目录的 WebDAV 功能。
编辑 Apache 的默认配置文件(例如 /etc/apache2/sites-available/000-default.conf),添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 Alias /webdav /var/www/webdav <Directory /var/www/webdav> DAV On AuthType Basic AuthName "WebDAV" AuthUserFile /etc/apache2/.htpasswd Require valid-user <LimitExcept GET OPTIONS> Require valid-user </LimitExcept> </Directory>
3. 创建 WebDAV 目录并设置权限 创建用于存储 WebDAV 文件的目录,并设置适当的权限:
1 2 3 sudo mkdir /var/www/webdav sudo chown -R www-data:www-data /var/www/webdav sudo chmod -R 755 /var/www/webdav
4. 设置用户认证 为了保护 WebDAV 目录,需要设置基本的 HTTP 认证。创建一个认证文件并添加用户:
1 sudo htpasswd -c /etc/apache2/.htpasswd username
系统会提示输入并确认用户的密码。
5. 重启 Apache 服务器 完成上述配置后,重启 Apache 服务器以应用更改:
1 2 3 sudo systemctl restart apache2 sudo systemctl status apache2 # 查看是否正常运行
访问 WebDAV 服务器 现在,WebDAV 服务器已经配置完成,可以通过以下 URL 访问:
1 http://your-server-ip/webdav
验证配置 你可以使用 Web 浏览器、命令行工具(如 curl)、或者 WebDAV 客户端(如 Cyberduck、WinSCP)来测试 WebDAV 服务器。
使用 curl 命令行工具测试:
1 2 3 4 5 # 上传文件 curl -u username:password -T localfile.txt http://your-server-ip/webdav/remote.txt # 下载文件 curl -u username:password -O http://your-server-ip/webdav/remote.txt
示例客户端访问(Python) 使用 Python 中的 requests 库来访问 WebDAV 服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import requests from requests.auth import HTTPBasicAuth url = 'http://your-server-ip/webdav/test.txt' username = 'your-username' password = 'your-password' # 上传文件 with open('localfile.txt', 'rb') as f: response = requests.put(url, data=f, auth=HTTPBasicAuth(username, password)) print(response.status_code) # 下载文件 response = requests.get(url, auth=HTTPBasicAuth(username, password)) with open('downloaded_test.txt', 'wb') as f: f.write(response.content) print(response.status_code)
结论 通过上述步骤,你已经成功在 Ubuntu 上使用 Apache HTTP Server 搭建了一个 WebDAV 服务器。WebDAV 服务器可以用于在线存储和管理文件,适用于协作编辑和文件同步。通过适当的认证和权限设置,可以确保数据的安全性。
其他操作 1、检查 Apache 错误日志 1 sudo tail -f /var/log/apache2/error.log
2、测试本地连接 1 2 curl -u username:password http://localhost/webdav/
3、检查 Apache 配置文件语法 1 2 sudo apache2ctl configtest
如果输出包含 Syntax OK,则表示配置文件语法正确。如果有错误,请根据提示修正。
4、检查监听端口 确保 Apache 正在监听端口 80:
1 2 sudo netstat -tuln | grep :80
输出中应该有一行类似以下内容:
1 2 tcp6 0 0 :::80 :::* LISTEN
5、清理现有配置: 1 2 3 4 sudo a2dismod dav dav_fs sudo rm /etc/apache2/.htpasswd sudo rm -rf /var/www/webdav
6、修改 Apache 配置监听端口 首先,您需要确保 Apache 监听端口 8080。编辑 Apache 的主配置文件(通常是 ports.conf):
1 2 sudo vi /etc/apache2/ports.conf
添加以下行(如果已存在,确认其配置正确):
配置虚拟主机以使用端口 8080
编辑默认的虚拟主机配置文件(通常是 000-default.conf):
1 sudo nano /etc/apache2/sites-available/000-default.conf
将 <VirtualHost *:80> 修改为 <VirtualHost *:8080>
,并确保配置正确:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /webdav /var/www/webdav <Directory /var/www/webdav> DAV On AuthType Basic AuthName "WebDAV" AuthUserFile /etc/apache2/.htpasswd Require valid-user <LimitExcept GET OPTIONS> Require valid-user </LimitExcept> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
7、You don’t have permission to access this resource. 访问 wevdav 服务器时,提示You don't have permission to access this resource.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /webdav /var/www/webdav <Directory /var/www/webdav> # 添加如下 3 行配置 Options Indexes FollowSymLinks AllowOverride None Require all granted DAV On AuthType Basic AuthName "WebDAV" AuthUserFile /etc/apache2/.htpasswd Require valid-user <LimitExcept GET OPTIONS> Require valid-user </LimitExcept> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
8、修改WebDAV 目录 如果您不想使用 /var/www/webdav 作为 WebDAV 目录,可以选择其他目录并进行相应的配置。以下是详细步骤,以 /data/webdav 为例:
首先,在您希望的位置创建新的 WebDAV 目录:
1 2 3 sudo mkdir -p /data/webdav sudo chown -R www-data:www-data /data/webdav sudo chmod -R 755 /data/webdav
修改/etc/apache2/sites-available/000-default.conf配置文件中的 WebDAV 目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /webdav /data/webdav <Directory /data/webdav> Options Indexes FollowSymLinks AllowOverride None Require all granted DAV On AuthType Basic AuthName "WebDAV" AuthUserFile /etc/apache2/.htpasswd Require valid-user <LimitExcept GET OPTIONS> Require valid-user </LimitExcept> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
9、确认目录权限和修改 Apache 用户 确保 WebDAV 目录 /data/webdav 具有适当的权限,使得 Apache 用户(通常是 www-data)有读写权限。
1 2 3 sudo chown -R www-data:www-data /data/webdav sudo chmod -R 755 /data/webdav
确认 Apache 用户 确保 Apache 使用的用户和组是 www-data。这通常在 apache2.conf 或 envvars 文件中定义。
编辑 envvars 文件(Ubuntu/Debian 通常位于 /etc/apache2/envvars):
1 sudo vi /etc/apache2/envvars
确保以下行存在:
1 2 3 export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data
如果不想用 用户和组是 www-data, 则创建新的用户和用户组,并修改上述配置
10、上传文件到 WebDAV 服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import requests from requests.auth import HTTPBasicAuth # WebDAV 服务器的 URL 和目标路径 webdav_url = 'http://your-server-ip:8080/webdav/' file_path = 'localfile.txt' # 本地文件路径 remote_path = webdav_url + 'remote_file.txt' # 远程文件路径 # WebDAV 用户名和密码 username = 'your_username' password = 'your_password' # 打开本地文件 with open(file_path, 'rb') as file: # 使用 requests.put() 方法上传文件 response = requests.put(remote_path, data=file, auth=HTTPBasicAuth(username, password)) # 检查响应状态码 if response.status_code == 201 or response.status_code == 204: print('文件上传成功') else: print(f'文件上传失败,状态码: {response.status_code}') print(response.text)
11、上传文件夹到 WebDAV 服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import os import requests from requests.auth import HTTPBasicAuth # WebDAV 服务器的 URL 和目标路径 webdav_url = 'http://your-server-ip:8080/webdav/' local_folder = 'local_folder/' # 本地文件夹路径 # WebDAV 用户名和密码 username = 'your_username' password = 'your_password' # 上传单个文件 def upload_file(local_file, remote_file): with open(local_file, 'rb') as file: response = requests.put(remote_file, data=file, auth=HTTPBasicAuth(username, password)) return response.status_code # 递归上传文件夹中的所有文件 def upload_folder(local_folder, remote_folder): for root, _, files in os.walk(local_folder): for file in files: local_file = os.path.join(root, file) relative_path = os.path.relpath(local_file, local_folder) remote_file = os.path.join(remote_folder, relative_path).replace("\\", "/") response_code = upload_file(local_file, remote_file) if response_code in [201, 204]: print(f'文件上传成功: {local_file}') else: print(f'文件上传失败: {local_file},状态码: {response_code}') # 上传文件夹 upload_folder(local_folder, webdav_url)