在 Ubuntu 上使用 Apache 搭建 WebDAV 服务是一个成熟且可靠的方案,整个过程主要包括安装 Apache、启用 WebDAV 模块、配置虚拟主机、设置用户认证,以及为安全起见配置 HTTPS 加密。

下面是详细的步骤指南,以 Ubuntu 22.04/24.04 LTS 和 Apache2 为例。


第一步:安装 Apache 并启用必要模块

首先,更新软件包索引并安装 Apache。之后,启用 dav​ 和 dav_fs​ 这两个核心模块,它们是 Apache 支持 WebDAV 功能的基础。

# 1. 更新系统并安装 Apache
sudo apt update
sudo apt install apache2 apache2-utils -y

# 2. 启用 WebDAV 相关模块
sudo a2enmod dav
sudo a2enmod dav_fs

# 3. 重启 Apache 使模块生效
sudo systemctl restart apache2

如果出现 80 端口被占用,采取以下办法查找占用进程:

# 方法一:使用 ss 命令(推荐)
sudo ss -tulpn | grep :80
# 方法二:使用 netstat
sudo netstat -tulpn | grep :80
# 方法三:使用 lsof
sudo lsof -i :80

根据占用进程采取相应措施

  • 情况 A:端口被另一个 Apache 进程占用

这说明之前可能已经有一个 Apache 实例在运行,但 systemd 未正确跟踪。可以先尝试强制停止它:

# 停止所有 Apache 进程
sudo systemctl stop apache2
# 如果上面命令无效,可以强制终止所有 apache2 进程
sudo pkill -9 apache2
# 然后重新启动
sudo systemctl start apache2

如果仍然失败,检查是否有残留的 httpd​ 进程(某些发行版可能使用 httpd 名称):

sudo pkill -9 httpd
sudo systemctl restart apache2
  • 情况 B:端口被 nginx 或其他 Web 服务器占用

如果显示是 nginx,你可以选择停止它,让 Apache 接管 80 端口:

# 停止 nginx
sudo systemctl stop nginx
# 如果需要完全禁止 nginx 开机自启,可以执行:
sudo systemctl disable nginx

然后重新启动 Apache:

sudo systemctl restart apache2
  • 情况 C:没有其他 Web 服务,但端口仍被占用

可能是其他程序意外占用了 80 端口,比如某些开发工具或服务。此时可以查看是哪个程序(例如 python​、node​ 等),并根据情况停止它。

  • 情况C:Apache 被重复监听

如果你修改过 Apache 的监听端口配置(如 /etc/apache2/ports.conf​),确保其中没有重复的 Listen 80​ 指令。正常情况下,ports.conf​ 中只有一行 Listen 80​(或 Listen 8080​ 等)。

检查该文件:

cat /etc/apache2/ports.conf

如果发现有重复,注释掉多余的 Listen​ 行,然后重试。

  • 情况D:如果端口冲突无法立即解决,可临时更改 Apache 端口

如果你不想停止其他 Web 服务,也可以修改 Apache 监听其他端口(例如 8080),然后通过 http://your-server-ip:8080​ 访问。

编辑 /etc/apache2/ports.conf​:

sudo nano /etc/apache2/ports.conf

将 Listen 80​ 改为 Listen 8080​。

然后检查你创建的虚拟主机配置(如 /etc/apache2/sites-available/webdav.conf​)中 <VirtualHost :80>​ 也要改为 <VirtualHost :8080>​,或者直接使用 <VirtualHost >​ 匹配所有端口。修改后重新加载 Apache:

sudo systemctl restart apache2

验证 Apache 是否成功启动

启动后,运行以下命令查看状态:

sudo systemctl status apache2

如果显示 active (running)​,说明已成功。接着可以用浏览器访问 http://your-server-ip​(或你设置的端口)测试是否正常显示 Apache 默认页面(或你的 WebDAV 页面)。

第二步:创建 WebDAV 共享目录并设置权限

创建一个目录用于存放你希望通过 WebDAV 共享的文件,并将该目录的所有权交给 Apache 的运行用户(通常是 www-data​),以确保 Web 服务器有权限读写文件。

# 1. 创建共享目录(你可以根据需要修改路径)
sudo mkdir -p /var/www/webdav

# 2. 将目录的所有者改为 www-data
sudo chown www-data:www-data /var/www/webdav

# 3. 设置目录权限为 755
sudo chmod 755 /var/www/webdav

第三步:配置 Apache 虚拟主机

接下来,你需要为 WebDAV 服务创建一个 Apache 配置文件。这通常是在 /etc/apache2/sites-available/​ 目录下新建一个配置文件。

# 创建并编辑配置文件
sudo nano /etc/apache2/sites-available/webdav.conf

将以下配置内容粘贴到文件中。请根据你的实际情况,将 ServerName​ 后的 webdav.yourdomain.com​ 替换为你的服务器 IP 地址或域名。

# /etc/apache2/sites-available/webdav.conf
<VirtualHost *:80>
    # 请将此处的域名或IP替换为你自己的
    ServerName webdav.yourdomain.com
    DocumentRoot /var/www/webdav

    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # WebDAV 主配置区
    <Location />
        DAV On
        # 启用基本认证
        AuthType Basic
        AuthName "WebDAV Server - Please Login"
        # 用户密码文件的存放路径
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Location>

    # 日志配置(便于排错)
    ErrorLog ${APACHE_LOG_DIR}/webdav_error.log
    CustomLog ${APACHE_LOG_DIR}/webdav_access.log combined
</VirtualHost>

配置完成后,启用这个新站点并禁用默认站点,然后检查配置是否有语法错误。

# 1. 启用新站点
sudo a2ensite webdav.conf
# 2. 禁用默认站点(可选)
sudo a2dissite 000-default.conf
# 3. 检查配置文件语法
sudo apache2ctl configtest
# 如果看到 "Syntax OK",则重启 Apache
sudo systemctl restart apache2

第四步:设置用户认证

WebDAV 服务需要用户名和密码才能访问。使用 htpasswd​ 工具创建用户密码文件。执行以下命令,系统会提示你输入并确认密码。

# 创建一个新用户,例如 "alice"
# -c 参数表示创建新文件,仅在第一次添加用户时使用
sudo htpasswd -c /etc/apache2/.htpasswd alice

# 添加更多用户时,不要使用 -c 参数,否则会覆盖之前的文件
# sudo htpasswd /etc/apache2/.htpasswd bob

安全提示:为确保认证文件的安全,建议将其权限设置为只有 root 可读写。

sudo chmod 640 /etc/apache2/.htpasswd
sudo chown root:www-data /etc/apache2/.htpasswd

第五步:启用 HTTPS 加密(强烈推荐)

由于 HTTP 协议以明文传输数据,包括你的密码,因此在公网环境中使用存在巨大的安全风险。启用 HTTPS 加密是​生产环境中必须执行的一步​。

最简便的方法是使用 certbot​ 自动获取并配置 Let‘s Encrypt 的免费 SSL 证书。

# 1. 安装 certbot 和 Apache 插件
sudo apt install certbot python3-certbot-apache -y

# 2. 运行 certbot,它会自动检测并为你配置好 HTTPS
#    运行后,根据提示输入你的邮箱,并选择需要配置的域名(即 webdav.yourdomain.com)
sudo certbot --apache

完成此步骤后,你将可以通过 https://webdav.yourdomain.com​ 安全地访问你的 WebDAV 服务了。

第六步:客户端挂载与使用

作为客户端(访问别人的 WebDAV)

如果你的目的是挂载别人提供的 WebDAV 服务,可以参考以下步骤。

# 1. 安装 davfs2 客户端
sudo apt install davfs2 -y

# 2. 将当前用户添加到 davfs2 组,以便非 root 用户也能挂载
sudo usermod -aG davfs2 $USER
# 需要重新登录才能使组权限生效

# 3. 创建本地挂载点
mkdir ~/webdav-mount

# 4. 创建并配置认证文件(可选,用于自动登录)
#    注意:将下面的 URL、用户名和密码替换成你自己的
echo "https://webdav.yourdomain.com your_username your_password" >> ~/.davfs2/secrets
chmod 600 ~/.davfs2/secrets

# 5. 挂载 WebDAV 服务到本地目录
mount -t davfs https://webdav.yourdomain.com ~/webdav-mount

挂载成功后,你就可以像操作本地文件夹一样,通过 ~/webdav-mount​ 目录来访问和管理远程文件了。

常见问题与解决思路

  1. 连接后无法上传文件

    • 检查共享目录(如 /var/www/webdav​)的权限是否正确,它应该属于 www-data​ 用户。

  2. 忘记密码或需要修改密码

    • 使用 htpasswd​ 命令重新设置即可sudo htpasswd /etc/apache2/.htpasswd username​。

  3. ​davfs2​ 挂载失败,提示“权限不足”

    • 确保当前用户在 davfs2​ 用户组中,并且认证文件 ~/.davfs2/secrets​ 的权限是 600。

  4. 移动端(如 iPhone)无法连接

    • 确保服务器已配置并强制使用 HTTPS。iOS 的文件应用要求 WebDAV 连接必须是安全的(SSL/TLS)。