从零搭建内网资源下载站:登录鉴权、注册审核与邮件通知
本文记录我为校内网管会搭建一个「内网软件资源下载站」的完整过程:登录后才能下载、新用户自助注册 + 管理员审核、分类自动展示、大文件高效下发,以及局域网多入口反向代理。文中所有 IP、账号、口令、邮箱等敏感信息均已模糊处理。
一、需求与场景
需求很具体:把常用软件(设计工具、办公套件等)放在校园内网,供成员下载。它必须满足:
- 只有登录用户能下载,防止资源被外网随意抓取;
- 新用户自助注册,管理员审核通过后才能下载;
- 按分类展示资源,支持搜索,大文件(GB 级)也能稳定下载;
- 局域网内多个入口都能访问(直连服务器 IP,或走 NAS 反代);
- 有邮件通知(注册、审核结果),以及每日自动备份。
二、整体架构
最终架构如下:
技术栈:WordPress + Nginx + PHP-FPM + MariaDB,跑在一台内网 Ubuntu 服务器上;下载文件放在 Web 根目录之外,由 Nginx 鉴权后高效下发;局域网入口由飞牛 NAS 上的 Docker Nginx 反向代理。
核心原则只有一条:下载文件绝不放在 Web 根目录,一切下载都要经过登录鉴权。
三、下载鉴权:文件为什么放在 Web 根目录之外
- Web 根目录:
/var/www/wordpress - 下载文件目录:
/srv/downloads(Web 根之外,无法被直接 URL 访问) - 下载链接形如:
https://<下载站>/?llx_dl=<分类>/<文件名>
流程是这样的:
- 用户点下载 → 请求带上
?llx_dl=...; - WordPress 的 MU 插件校验登录态与审核状态,不通过则 403 / 跳登录;
- 校验通过后,插件返回一个
X-Accel-Redirect响应头,指向 Nginx 的 internal location; - Nginx 收到后在内部把
/srv/downloads/...的文件高效传给用户。
这样做有两个好处:
- 安全:文件不在 Web 根目录,无法绕过登录直接抓取;
- 高效:大文件由 Nginx 直接零拷贝传输,不占用 PHP 进程。
四、用户注册与审核工作流
站点开放自助注册(首页或登录页点「注册」)。新用户默认角色 subscriber、状态为待审核:
- 用户状态存于
wp_usermeta.llx_status:pending/approved/rejected; - 待审核用户即使登录,下载也会返回 403;
- 管理员在后台左侧「注册审核」菜单里查看待审用户,点「通过」即可放行;
- 后台顶部与菜单右侧有待审数量气泡提醒;
- 审核页支持:通过 / 拒绝 / 恢复待审 / 删除。
用 usermeta 存状态,好处是不污染 WordPress 原生用户表,升级/迁移都安全。
五、个人中心:普通用户与管理员分离
为了体验干净,普通用户登录后看到的是「个人中心」,而不是后台:
- 地址:
https://<下载站>/user-center/ - 功能:查看账号状态(待审核 / 已通过 / 已拒绝)、修改密码、退出登录;
- 非管理员访问
/wp-admin会被自动跳转回个人中心;只有管理员能看到「管理后台」。
六、邮件通知与 SMTP
站点的邮件通知全部由 MU 插件统一发送(WordPress 自带的新用户通知已关闭,避免重复)。用 msmtp 作为系统的 sendmail:
| 触发时机 | 收件人 | 内容 |
|---|---|---|
| 用户注册 | 注册用户 | 申请已收到,等待审核 |
| 用户注册 | 管理员 | 有新用户待审核(附「前往审核」按钮) |
| 审核通过 | 该用户 | 已通过,含用户名与自动生成的登录密码 |
| 审核拒绝 | 该用户 | 申请未通过 |
两个细节值得一提:
- HTML 邮件模板,含站点 Logo 与按钮,发件人显示站点名;
- 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 根证书,访问就没有证书警告。
两个关键点:
- 动态站点地址:WordPress 的
wp-config.php里加了动态 URL 逻辑,页面内所有链接会按当前访问入口自动生成,所以走反代和直连都正常; - 大文件关闭代理缓冲:反代配置里
proxy_buffering off,6GB 级文件也能稳定经反代下载。
反代透传 Host 与 X-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 或另一台主机(异地副本)。
十、安全加固
- 防火墙:ufw 只放行 22 / 80 / 443;
- 数据库:MariaDB 只监听
127.0.0.1,不对外; - 下载鉴权:文件在 Web 根目录外 + 登录态校验;
- 权限最小化:Web 文件属主
www-data,SSH 用普通用户 + sudo 提权; - 默认口令:部署后应尽快修改后台、数据库与 SSH 密码。
十一、经验总结
- 文件放 Web 根目录外 +
X-Accel-Redirect是内网下载站最实用的方案:安全且高效,大文件不压 PHP; - 注册审核用
usermeta存状态,简单、可扩展,不动原生用户表; - 邮件 Logo 用 CID 内嵌,彻底摆脱外链与证书依赖,内网邮件也能漂亮显示;
- 自建内网 CA + 多入口反代,让「直连 IP」和「走 NAS 域名」都有一致的访问体验;
- 首页自动扫描目录,把「加资源」变成「丢文件」,极大降低维护成本。
本文由个人实践整理,所有敏感信息已做模糊处理。架构仅供参考,请根据自身环境调整。