从零搭建内网资源下载站:登录鉴权、注册审核与邮件通知

本文记录我为校内网管会搭建一个「内网软件资源下载站」的完整过程:登录后才能下载、新用户自助注册 + 管理员审核、分类自动展示、大文件高效下发,以及局域网多入口反向代理。文中所有 IP、账号、口令、邮箱等敏感信息均已模糊处理。

一、需求与场景

需求很具体:把常用软件(设计工具、办公套件等)放在校园内网,供成员下载。它必须满足:

  1. 只有登录用户能下载,防止资源被外网随意抓取;
  2. 新用户自助注册,管理员审核通过后才能下载
  3. 分类展示资源,支持搜索,大文件(GB 级)也能稳定下载;
  4. 局域网内多个入口都能访问(直连服务器 IP,或走 NAS 反代);
  5. 有邮件通知(注册、审核结果),以及每日自动备份。

二、整体架构

最终架构如下:

内网资源下载站架构图

技术栈:WordPress + Nginx + PHP-FPM + MariaDB,跑在一台内网 Ubuntu 服务器上;下载文件放在 Web 根目录之外,由 Nginx 鉴权后高效下发;局域网入口由飞牛 NAS 上的 Docker Nginx 反向代理。

核心原则只有一条:下载文件绝不放在 Web 根目录,一切下载都要经过登录鉴权。

三、下载鉴权:文件为什么放在 Web 根目录之外

  • Web 根目录:/var/www/wordpress
  • 下载文件目录:/srv/downloads(Web 根之外,无法被直接 URL 访问)
  • 下载链接形如:https://<下载站>/?llx_dl=<分类>/<文件名>

流程是这样的:

  1. 用户点下载 → 请求带上 ?llx_dl=...
  2. WordPress 的 MU 插件校验登录态与审核状态,不通过则 403 / 跳登录;
  3. 校验通过后,插件返回一个 X-Accel-Redirect 响应头,指向 Nginx 的 internal location
  4. Nginx 收到后在内部/srv/downloads/... 的文件高效传给用户。

这样做有两个好处:

  • 安全:文件不在 Web 根目录,无法绕过登录直接抓取;
  • 高效:大文件由 Nginx 直接零拷贝传输,不占用 PHP 进程。

四、用户注册与审核工作流

站点开放自助注册(首页或登录页点「注册」)。新用户默认角色 subscriber、状态为待审核

  • 用户状态存于 wp_usermeta.llx_statuspending / approved / rejected
  • 待审核用户即使登录,下载也会返回 403
  • 管理员在后台左侧「注册审核」菜单里查看待审用户,点「通过」即可放行;
  • 后台顶部与菜单右侧有待审数量气泡提醒;
  • 审核页支持:通过 / 拒绝 / 恢复待审 / 删除。

usermeta 存状态,好处是不污染 WordPress 原生用户表,升级/迁移都安全。

五、个人中心:普通用户与管理员分离

为了体验干净,普通用户登录后看到的是「个人中心」,而不是后台:

  • 地址:https://<下载站>/user-center/
  • 功能:查看账号状态(待审核 / 已通过 / 已拒绝)、修改密码、退出登录;
  • 非管理员访问 /wp-admin 会被自动跳转回个人中心;只有管理员能看到「管理后台」。

六、邮件通知与 SMTP

站点的邮件通知全部由 MU 插件统一发送(WordPress 自带的新用户通知已关闭,避免重复)。用 msmtp 作为系统的 sendmail

触发时机 收件人 内容
用户注册 注册用户 申请已收到,等待审核
用户注册 管理员 有新用户待审核(附「前往审核」按钮)
审核通过 该用户 已通过,含用户名与自动生成的登录密码
审核拒绝 该用户 申请未通过

两个细节值得一提:

  1. HTML 邮件模板,含站点 Logo 与按钮,发件人显示站点名;
  2. Logo 用 CID 内嵌cid:llxlogo)随邮件一起发送,不依赖外链,所以即使站点在内网、证书自签,外网邮箱也能正常显示 Logo。

审核通过时,系统会自动生成一个 12 位密码并重置该用户密码,随邮件发出,用户登录后可自行修改。

更换 SMTP 账号只需一行:

sudo llx-set-smtp.sh 163  你的邮箱@163.com  授权码
sudo llx-set-smtp.sh qq   你的邮箱@qq.com   授权码

七、资源管理与首页自动扫描

资源目录规则:

/srv/downloads/<分类>/<文件>

上传(本机执行):

scp -i <密钥> "本地文件" llx_mir@<下载站>:/tmp/
ssh llxmirror
sudo mv /tmp/你的文件 /srv/downloads/Adobe/
sudo chown www-data:www-data /srv/downloads/Adobe/你的文件

首页会自动扫描 /srv/downloads,按分类生成卡片(文件名、大小、搜索框、下载按钮),无需手动维护列表。新建分类只需 sudo mkdir /srv/downloads/新分类 再放文件即可。

八、局域网反向代理(飞牛 NAS)

为了给局域网提供统一入口,在飞牛 NAS 上用 Docker Nginx(llx-proxy)反代到下载站,提供 HTTP/HTTPS 多个端口。

HTTPS 证书自建内网 CA 签发,SAN 里包含下载站 IP、NAS IP 与主机名,有效期 10 年。客户端只需导入一次 CA 根证书,访问就没有证书警告

两个关键点:

  1. 动态站点地址:WordPress 的 wp-config.php 里加了动态 URL 逻辑,页面内所有链接会按当前访问入口自动生成,所以走反代和直连都正常;
  2. 大文件关闭代理缓冲:反代配置里 proxy_buffering off,6GB 级文件也能稳定经反代下载。

反代透传 HostX-Forwarded-Proto,容器 restart: unless-stopped + Docker 开机自启。

九、备份与运维

  • 每日 03:00 自动备份,保留 14 天llx-backup.sh);
  • 常用命令:
sudo systemctl status nginx php7.4-fpm mariadb
sudo nginx -t
sudo tail -f /var/log/nginx/error.log
sudo du -sh /srv/downloads

备份与数据在同一磁盘,重要数据建议再同步到 NAS 或另一台主机(异地副本)。

十、安全加固

  1. 防火墙:ufw 只放行 22 / 80 / 443;
  2. 数据库:MariaDB 只监听 127.0.0.1,不对外;
  3. 下载鉴权:文件在 Web 根目录外 + 登录态校验;
  4. 权限最小化:Web 文件属主 www-data,SSH 用普通用户 + sudo 提权;
  5. 默认口令:部署后应尽快修改后台、数据库与 SSH 密码。

十一、经验总结

  • 文件放 Web 根目录外 + X-Accel-Redirect 是内网下载站最实用的方案:安全且高效,大文件不压 PHP;
  • 注册审核用 usermeta 存状态,简单、可扩展,不动原生用户表;
  • 邮件 Logo 用 CID 内嵌,彻底摆脱外链与证书依赖,内网邮件也能漂亮显示;
  • 自建内网 CA + 多入口反代,让「直连 IP」和「走 NAS 域名」都有一致的访问体验;
  • 首页自动扫描目录,把「加资源」变成「丢文件」,极大降低维护成本。

本文由个人实践整理,所有敏感信息已做模糊处理。架构仅供参考,请根据自身环境调整。


从零搭建内网资源下载站:登录鉴权、注册审核与邮件通知
https://linxiang.cloud//archives/intranet-resource-download-site
作者
Administrator
发布于
2026年09月11日
许可协议