使用 Nginx 构建安全可控的文件下载服务器
摘要 :本文介绍如何使用 Nginx + HTTPS + Basic Auth 构建一套轻量、安全、可扩展的文件下载服务器,替代传统 FTP,支持多用户目录隔离与加密访问。
一、背景与需求
传统的 FTP 协议已逐渐被弃用,现代浏览器不再支持 ftp:// 访问方式。
如果你想在公网提供文件下载服务(如科研数据、日志、镜像等),可以使用 Nginx 构建一个 HTTPS 文件下载服务器。
目标:
- 文件大(1GB+)可断点续传;
- 用户访问受控;
- 超级用户可查看所有目录;
- 部署与扩展简单。
二、系统架构
| 模块 | 功能说明 |
|---|---|
| Nginx | 文件目录索引与下载 |
| HTTPS | 加密传输 |
| Basic Auth | 简易身份认证 |
| Per-directory ACL | 用户仅能访问同名目录 |
三、目录结构
/data/downloads/
├── beijing/
├── henan/
├── shanxi/
├── shanghai/
└── shandong/
四、用户认证
bash
yum install -y httpd-tools
mkdir -p /etc/nginx/passwd
htpasswd -c /etc/nginx/passwd/users.htpasswd beijing
htpasswd /etc/nginx/passwd/users.htpasswd henan
htpasswd /etc/nginx/passwd/users.htpasswd admin
五、生成 HTTPS 自签证书
bash
mkdir -p /etc/nginx/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/certs/self.key -out /etc/nginx/certs/self.crt -subj "/C=CN/ST=Henan/L=Zhengzhou/O=Personal/OU=Dev/CN=files.example.com"
六、Nginx 配置文件(核心)
nginx
server {
listen 443 ssl;
http2 on;
server_name files.example.com;
ssl_certificate /etc/nginx/certs/self.crt;
ssl_certificate_key /etc/nginx/certs/self.key;
root /data/downloads;
auth_basic_user_file /etc/nginx/passwd/users.htpasswd;
location ~ ^/(?!relogin(?:/|$))[^/]+(?:/|$) {
auth_basic "dir:$req_user";
if ($deny_after_auth) {
add_header WWW-Authenticate 'Basic realm="dir:$req_user", charset="UTF-8"' always;
return 401;
}
autoindex on;
add_header Accept-Ranges bytes;
sendfile on; aio threads; directio 8m; tcp_nopush on;
}
location = / {
if ($is_super = 0) { return 403; }
autoindex on;
}
location ^~ /relogin {
auth_basic off;
default_type text/plain;
add_header WWW-Authenticate 'Basic realm="Relogin", charset="UTF-8"' always;
return 401;
}
location / { return 404; }
}
七、权限控制映射(00-auth-maps.conf)
nginx
map $uri $req_user {
default "";
~^/([^/]+)(?:/|$) $1;
}
map $remote_user $is_authed {
"" 0;
default 1;
}
map "$remote_user:$req_user" $self_match {
~^([^:]+):$ 1;
default 0;
}
map $remote_user $is_super {
default 0;
admin 1;
root 1;
}
map "$is_authed:$self_match:$is_super" $deny_after_auth {
~^0:.*:.*$ 0;
~^1:1:.*$ 0;
~^1:.*:1$ 0;
default 1;
}
八、测试与验证
bash
nginx -t && nginx -s reload
curl -I https://files.example.com/beijing/
curl -I -u beijing:密码 https://files.example.com/beijing/
curl -I -u henan:密码 https://files.example.com/beijing/
九、最终效果
✅ 支持大文件下载
✅ 支持目录索引
✅ 各用户仅能访问自目录
✅ /relogin 可强制切换账号