一、为什么下载站要增加访问控制

原笔记在基础下载站之上,又提出了两个增强需求:

  • svip 目录增加认证功能
  • 给站点增加状态统计功能

这两个需求对应的是两类常见运维场景:

  • 有些目录不是所有人都能直接访问
  • 有些信息需要专门暴露给运维或监控系统查看

二、如何为 svip 目录增加账号密码认证

原笔记通过 auth_basic 模块给 /svip/ 增加了认证规则,配置如下:

server {
    listen       80;
    server_name  v.oldboylinux.cn;
    root   /app/code/v;
    error_log /var/log/nginx/v-error.log notice;
    access_log /var/log/nginx/v-access.log main;
    autoindex on;
    autoindex_localtime on;
    autoindex_exact_size off;
    location / {
        index  index.html;
    }

    location /svip/ {
        auth_basic "Please input password:";
        auth_basic_user_file /etc/nginx/user;
    }
}

这里最关键的是两条指令:

  • auth_basic:开启基础认证,并设置提示语
  • auth_basic_user_file:指定用户名密码文件

三、密码文件该怎么准备

原笔记的完整操作步骤如下。

先准备受保护目录和测试文件:

[root@oldboy01 conf.d]# mkdir -p /app/code/v/svip/
[root@oldboy01 conf.d]# touch /app/code/v/svip/svip-16k-{01..10}.torrent

再安装工具并生成密码文件:

[root@oldboy01 conf.d]# yum install -y httpd-tools
[root@oldboy01 conf.d]# htpasswd -bc /etc/nginx/user lidao996 1

# 添加新用户时不要再加 -c
[root@oldboy01 conf.d]# htpasswd -b /etc/nginx/user oldboy 1

最后调整权限:

[root@oldboy01 conf.d]# chmod 600 /etc/nginx/user
[root@oldboy01 conf.d]# chown nginx.nginx /etc/nginx/user

这里的重点很明确:

  • 第一次创建密码文件时才用 -c
  • 后续追加用户不能再用 -c,否则会覆盖原内容
  • 密码文件权限要尽量收紧

四、如何验证认证已经生效

原笔记的验证方式很直接:

1、先执行 nginx -t 2、再执行 systemctl reload nginx 3、浏览器访问 http://v.oldboylinux.cn/svip/ 4、输入用户名 lidao996 和密码 1

如果能弹出认证框,并在输入正确账号密码后访问到目录内容,就说明认证功能已经生效。

五、如何为站点增加状态统计页面

原笔记接着又加入了 stub_status 模块,配置如下:

location /status {
    stub_status;
}

整合进站点配置后的关键部分如下:

server {
    listen       80;
    server_name  v.oldboylinux.cn;
    root   /app/code/v;
    error_log /var/log/nginx/v-error.log notice;
    access_log /var/log/nginx/v-access.log main;
    autoindex on;
    autoindex_localtime on;
    autoindex_exact_size off;

    location / {
        index  index.html;
    }

    location /svip/ {
        auth_basic "Please input password:";
        auth_basic_user_file /etc/nginx/user;
    }

    location /status {
        stub_status;
    }
}

访问:

http://v.oldboylinux.cn/status

就能看到 Nginx 的当前状态信息。

六、stub_status 页面里的指标该怎么理解

原笔记对状态页中的指标做了详细说明,核心可以整理为:

指标 含义
Active connections 当前活动连接数,体现并发情况
accepts 已接受的客户端连接总数
handled 已处理的连接总数
requests 已处理的请求总数
reading 正在读取请求头的连接数
writing 正在向客户端写响应的连接数
waiting 等待中的空闲连接数量

原笔记特别强调:

  • Active connections 可以帮助理解当前并发
  • readingwritingwaiting 分别能反映连接所处阶段

七、如何配合压力测试观察状态变化

原笔记最后还补了一个很实用的实验:

先查看 CPU 核心数,确认并发参考值:

[root@oldboy01 conf.d]# lscpu
...
CPU(s):                8
...

再使用 ab 做压力测试:

[root@oldboy01 conf.d]# ab -n 99999 -c 8 -H Host:v.oldboylinux.cn http://192.168.1.20/

同时刷新:

http://v.oldboylinux.cn/status

就能直观看到状态页指标的变化。

八、这个案例里涉及了哪些常用模块

原笔记最后对模块做了一个汇总,这里可以简化理解为:

  • autoindex:目录索引
  • auth_basic:基础认证
  • allow / deny:访问控制
  • stub_status:运行状态监控
  • rootlocationlistenserver_name:Nginx 核心站点指令
  • access_loglog_format:日志记录

这也说明,一个看似简单的下载站,实际上已经把很多常见 Nginx 能力串联起来了。

九、小结

这个案例很适合拿来理解两类高频配置:

  • 如何给敏感目录增加基础认证
  • 如何给运维侧暴露 Nginx 状态页

对入门阶段来说,auth_basicstub_status 都是非常值得先掌握的基础功能。