使用Nginx反向代理+Apache构建高性能目录列表服务
1. 方案概述
本方案通过 Nginx(前台) + Apache(后台) 的组合,实现一个高性能、高定制性的文件目录列表服务。
- Nginx:监听公网80(HTTP)和443(HTTPS)端口,处理高并发连接和SSL加密。
- Apache:监听本机8080端口,利用强大的
mod_autoindex模块生成精美的文件目录列表。
这种架构既能享受Nginx的高性能和安全特性,又能充分利用Apache在目录列表功能上的高度可定制性。
2. 环境准备
- 操作系统:Ubuntu 20.04 / 22.04 / 24.04 LTS
- 软件:Nginx、Apache2
- 权限:具有
sudo权限的用户 - 域名(可选):如果你需要HTTPS,准备一个已解析到服务器IP的域名
3. 第一阶段:安装与配置Apache(后台服务)
Apache将作为后端服务,仅监听本机端口,负责生成目录列表。
3.1 安装Apache
sudo apt update
sudo apt install apache2 -y
3.2 修改Apache监听端口(避免与Nginx冲突)
sudo nano /etc/apache2/ports.conf
将 Listen 80 修改为:
Listen 127.0.0.1:8080
这样Apache只监听本机8080端口,对外不可直接访问。
3.3 准备目录列表的根目录
# 创建你要展示的目录(根据实际需要调整路径)
sudo mkdir -p /var/www/files
# 放入一些测试文件
sudo touch /var/www/files/test1.txt
sudo touch /var/www/files/test2.pdf
sudo mkdir /var/www/files/subfolder
注意:确保该目录下 没有 index.html 文件,否则Apache会显示页面而非目录列表。
3.4 创建Apache虚拟主机配置
sudo nano /etc/apache2/sites-available/filelist.conf
写入以下内容:
<VirtualHost 127.0.0.1:8080>
ServerName localhost
DocumentRoot /var/www/files
<Directory /var/www/files>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/filelist_error.log
CustomLog ${APACHE_LOG_DIR}/filelist_access.log combined
</VirtualHost>
3.5 启用站点并重载Apache
sudo a2ensite filelist.conf
sudo systemctl reload apache2
3.6 测试Apache是否正常(可选)
在服务器本地执行:
curl http://127.0.0.1:8080/
如果返回的HTML内容包含 test1.txt 等文件名,说明Apache已准备就绪。
4. 第二阶段:安装与配置Nginx(前台代理)
Nginx将接收外部请求,并转发给后台的Apache处理。
4.1 安装Nginx
sudo apt install nginx -y
4.2 创建Nginx虚拟主机配置
sudo nano /etc/nginx/sites-available/filelist
写入以下内容:
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或服务器IP
location / {
proxy_pass http://127.0.0.1:8080; # 转发到Apache
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
4.3 启用站点并重载Nginx
sudo ln -s /etc/nginx/sites-available/filelist /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置语法
sudo systemctl reload nginx
4.4 测试最终效果
在浏览器中访问 http://your-domain.com 或 http://你的服务器IP。你应该能看到Apache生成的目录列表页面,路径中的 /var/www/files 内容已通过Nginx展示出来。
5. 第三阶段:启用HTTPS(443端口)——可选但推荐
如果你有域名,可以使用Let’s Encrypt免费证书启用HTTPS。
5.1 安装Certbot
sudo apt install certbot python3-certbot-nginx -y
5.2 获取并自动配置证书
sudo certbot --nginx -d your-domain.com
Certbot会自动修改你的Nginx配置,添加443端口的HTTPS虚拟主机,并设置HTTP到HTTPS的重定向。
5.3 验证HTTPS
访问 https://your-domain.com,确认证书生效且目录列表功能正常。
6. 进阶定制与优化
6.1 自定义Apache目录列表样式
在Apache的 <Directory> 块中添加 IndexOptions 指令:
<Directory /var/www/files>
Options Indexes FollowSymLinks
IndexOptions +FancyIndexing +SuppressSize # 隐藏文件大小列
IndexOrderDefault Descending Name # 默认按名称降序排列
HeaderName /custom-header.html # 列表顶部自定义内容
ReadmeName /custom-footer.html # 列表底部自定义内容
</Directory>
6.2 限制访问(可选)
如果需要对目录列表进行访问控制,可以在Nginx配置中添加基础认证:
# 创建密码文件
sudo htpasswd -c /etc/nginx/.htpasswd user1
然后在Nginx的 location 块中添加:
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
# 其他代理头...
}
7. 故障排查指南
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 访问显示502 Bad Gateway | Apache未运行或8080端口未监听 | 检查Apache状态:sudo systemctl status apache2;确认监听端口:sudo netstat -tlnp | grep 8080 |
| 访问显示Apache默认页面 | 默认站点000-default.conf仍启用且优先级高 | 禁用默认站点:sudo a2dissite 000-default.conf,重载Apache |
| Nginx无法启动 | 配置语法错误或80端口被占用 | 检查:sudo nginx -t;查看日志:sudo tail -f /var/log/nginx/error.log |
| 目录列表未显示,出现403 | 目录权限不足或Options Indexes未开启 | 检查目录权限:sudo chmod 755 /var/www/files;确认Apache配置包含Indexes并重载 |
| 访问被拒绝或循环重定向(HTTPS) | Certbot重定向配置与代理头冲突 | 在Nginx配置中确认 proxy_set_header X-Forwarded-Proto $scheme; 已设置 |
8. 方案总结
通过本方案,你获得了以下收益:
✅ 高性能:Nginx处理前端并发,减轻Apache压力。
✅ 高定制性:Apache的 mod_autoindex 提供丰富的目录列表定制选项。
✅ 安全增强:Nginx可统一处理SSL终止,并可添加访问控制。
✅ 架构清晰:前后端分离,便于后续维护和扩展(如更换后端为其他Web服务器)。
你可以根据实际需求,随时调整Apache的 IndexOptions 或Nginx的代理规则,灵活适应不同的文件共享场景。