跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

使用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 GatewayApache未运行或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的代理规则,灵活适应不同的文件共享场景。

作者

老丹

关注我
其他文章
上一个

阿里云ECS通过HE隧道获取IPv6:完整安装指南

下一个

Ubuntu 24.04 安装 Docker 完整指南

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号