nginx-file-server

使用 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 可强制切换账号

相关推荐
charlie11451419110 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
Agent手记10 小时前
异常考勤智能预警与处理与流程优化方案 | 基于企业级Agent的超自动化实战教程
运维·人工智能·ai·自动化
cen__y11 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
雨辰AI11 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202412 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有12 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao12 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_7488394912 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录12 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
dapeng-大鹏13 小时前
KVM+LVM 零停机在线扩容 Ubuntu 根分区:从磁盘添加到逻辑卷扩展完整
linux·运维·ubuntu·磁盘空间扩展