Apache HTTP 服务器是全球使用最广泛的 Web 服务器之一,除了提供网页服务外,它还能高效地配置为文件下载服务器,满足企业、个人或组织对文件共享、资源分发等需求,通过合理的配置,Apache 可以实现安全、稳定且可控的文件下载功能,支持大文件传输、权限管理、流量控制等高级特性,以下将从环境准备、基础配置、高级优化及安全防护等方面,详细介绍如何使用 Apache 搭建文件下载服务器。

环境准备与基础安装
在开始配置前,需确保系统已安装 Apache 服务器,以 Linux 系统为例(如 Ubuntu/CentOS),可通过包管理器进行安装:
- Ubuntu/Debian:
sudo apt update && sudo apt install apache2 - CentOS/RHEL:
sudo yum install httpd
安装完成后,启动 Apache 服务并设置开机自启:
- Ubuntu:
sudo systemctl start apache2 && sudo systemctl enable apache2 - CentOS:
sudo systemctl start httpd && sudo systemctl enable httpd
默认情况下,Apache 的网站根目录位于 /var/www/html(Ubuntu)或 /var/www/html(CentOS),若需配置专属的文件下载目录,建议创建独立目录,/var/www/download,并将待下载文件存放于此。
基础文件下载配置
创建下载目录并设置权限
sudo mkdir -p /var/www/download sudo chown -R www-data:www-data /var/www/download # 设置所属用户为 Apache 运行用户 sudo chmod -R 755 /var/www/download # 设置读写执行权限
将下载文件(如 software.zip、document.pdf)复制到 /var/www/download 目录中。

配置虚拟主机指向下载目录
编辑 Apache 配置文件(如 /etc/apache2/sites-available/000-default.conf 或 /etc/httpd/conf/httpd.conf),添加以下内容:
<VirtualHost *:80>
ServerName download.example.com # 替换为实际域名或IP
DocumentRoot /var/www/download
# 设置目录索引(可选,若需显示目录列表)
<Directory /var/www/download>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 自定义错误页面(可选)
ErrorDocument 404 /404.html
</VirtualHost>
Indexes:允许目录列表浏览,若需禁用可删除此项;FollowSymLinks:支持符号链接;Require all granted:允许所有用户访问。
保存配置后,重启 Apache 服务使配置生效:
- Ubuntu:
sudo systemctl restart apache2 - CentOS:
sudo systemctl restart httpd
测试基础下载功能
通过浏览器访问 http://服务器IP/ 或 http://download.example.com/,若能看到文件列表,点击文件即可触发下载,若需直接下载而非浏览器预览(如图片、文本文件),需进一步配置 Header。
高级功能优化
强制文件下载(避免浏览器预览)
对于图片、PDF、TXT 等浏览器可直接预览的文件,可通过 mod_headers 模块强制弹出下载对话框,在 <Directory> 段落中添加:

<FilesMatch "\.(pdf|jpg|png|txt|zip|rar)$">
Header set Content-Disposition attachment
</FilesMatch>
FilesMatch:匹配指定扩展名的文件;Content-Disposition attachment:告诉浏览器以附件形式下载文件。
启用 mod_headers 模块(Ubuntu 需手动启用):
sudo a2enmod headers sudo systemctl restart apache2
限制下载速度与并发连接
为避免单个用户占用过多带宽,可通过 mod_bw 模块限制下载速度和并发数。
- 安装
mod_bw(以 Ubuntu 为例):sudo apt install libapache2-mod-bw sudo a2enmod bw sudo systemctl restart apache2
- 在配置文件中添加限速规则:
<Directory /var/www/download> BandWidthModule On ForceBandWidthModule On BandWidth all 102400 # 全局限制:100KB/s BandWidthClass limit1 10240 # 定义限速类:10KB/s <LimitExcept GET POST> Order Deny,Allow Deny from all </LimitExcept> <FilesMatch "large_file.zip"> BandWidthClass limit1 # 对指定文件应用限速类 MaxConnection all 5 # 最大并发连接数:5 </FilesMatch> </Directory> BandWidth:全局带宽限制(单位:字节/秒);BandWidthClass:自定义限速规则,可针对特定文件或目录应用;MaxConnection:限制单个文件的最大并发下载数。
设置目录列表样式
若允许目录浏览,可通过 mod_autoindex 自定义列表样式,在 <Directory> 中添加:
<Directory /var/www/download>
IndexOptions FancyIndexing NameSortDescriptionSize SuppressIcon SuppressSize
IndexIgnore .git *.tmp # 忽略指定文件或目录
HeaderName /header.html # 自定义目录页头
ReadmeName /readme.html # 自定义目录页脚
</Directory>
FancyIndexing:启用增强型目录列表(显示图标、文件大小等);IndexIgnore:隐藏不需要显示的文件;HeaderName/ReadmeName:指向自定义的 HTML 文件,添加目录页头/页脚说明。
安全防护配置
防止目录遍历攻击
禁用 MultiViews 并限制目录访问权限,避免恶意用户通过 访问敏感文件:
<Directory /var/www/download>
Options -Indexes FollowSymLinks # 禁用目录列表(可选)
AllowOverride None
Require all granted
<LimitExcept GET POST>
Require ip 192.168.1.0/24 # 仅允许内网IP上传/修改(若有上传功能)
</LimitExcept>
</Directory>
限制访问来源(IP白名单)
若仅允许特定 IP 访问下载服务,可通过 Require 指令设置 IP 白名单:
<Directory /var/www/download>
Require ip 192.168.1.100 # 仅允许指定IP访问
Require ip 10.0.0.0/8 # 允许整个网段访问
</Directory>
防盗链保护
为防止其他网站直接引用服务器文件造成流量盗用,可配置 mod_rewrite 实现防盗链:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$ # 允许空 Referer(如浏览器直接访问)
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] # 允许指定域名
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?trusted-site.com [NC] # 允许多个域名
RewriteRule \.(jpg|jpeg|png|gif|zip|rar)$ - [F,NC] # 禁止盗链文件,返回403错误
常见问题排查
-
文件下载失败(403 Forbidden)
检查文件目录权限是否为755,文件所属用户是否为www-data,以及 Apache 配置中Require指令是否限制访问。 -
大文件下载中断
确认 Apache 配置中LimitRequestBody参数是否限制了上传/下载大小(默认为0,无限制),或检查服务器防火墙、代理超时设置。
相关问答FAQs
Q1: 如何配置 Apache 支持断点续传?
A: Apache 默认支持断点续传,无需额外配置,需确保 mod_headers 模块已启用,并在 <Directory> 中添加 Header set Accept-Ranges bytes(部分系统默认已包含),若仍无法续传,检查文件是否为动态生成内容(如 PHP 脚本输出),动态内容需手动处理 Range 请求头。
Q2: 如何为下载目录设置用户名和密码保护?
A: 使用 mod_auth_basic 模块创建基本认证,步骤如下:
- 生成密码文件:
sudo htpasswd -c /etc/apache2/.htpasswd username(首次创建用-c,后续添加用户删除-c); - 在
<Directory>中添加认证配置:<Directory /var/www/download> AuthType Basic AuthName "Restricted Area" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> - 重启 Apache 服务即可实现密码访问控制。
