如何在 Nginx 中配置 Basic Auth 密码认证保护特定目录访问

文章导读
在 Nginx 中配置 Basic Auth 密码认证保护特定目录,需要在 location 块中添加 auth_basic 和 auth_basic_user_file 指令,并配合 htpasswd 工具生成密码文件。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Nginx 中配置 Basic Auth 密码认证保护特定目录,需要在 location 块中添加 auth_basic 和 auth_basic_user_file 指令,并配合 htpasswd 工具生成密码文件。

该方案适合保护后台入口或敏感文件,但必须配合 HTTPS 使用,否则密码会以 Base64 编码明文传输,存在被嗅探风险。

先说结论:配置 Nginx Basic Auth 的核心是生成密码文件并在 location 块中启用 auth_basic 模块,无需重启服务即可生效。

  • 适合:保护管理后台、临时封闭特定目录或限制 API 访问。
  • 先准备:安装 apache2-utils 或 httpd-tools 工具包,确保证书文件权限安全。
  • 验收:使用 curl 命令或未登录浏览器访问,确认弹出认证框且错误密码被拒绝。

命令速用版

以下命令用于生成密码文件并展示基础配置结构,直接复制需修改路径和域名。

# 1. 生成密码文件(首次创建用 -c,追加用户去掉 -c)
htpasswd -c /etc/nginx/.passwd username

# 2. Nginx 配置片段
location /protected/ {
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.passwd;
}

# 3. 检查并重载配置
nginx -t
nginx -s reload

为什么会这样

Nginx 的 auth_basic 模块通过 HTTP 协议标准的 Authorization 头进行身份验证,浏览器会自动处理弹窗逻辑。

当用户访问受保护目录时,Nginx 返回 401 状态码,浏览器弹出输入框。用户输入凭证后,Nginx 将密码加密哈希与密码文件中的记录比对。该机制依赖客户端配合,不适合需要自定义登录界面或复杂权限管理的场景,但配置成本极低。

分步处理

按顺序执行以下步骤,每步完成后检查对应状态,确保配置无误。

步骤 1:安装密码工具

Linux 发行版默认可能未安装 htpasswd 命令,需手动安装工具包。

Debian/Ubuntu 系统执行:apt-get install apache2-utils

CentOS/RHEL 系统执行:yum install httpd-tools

如何在 Nginx 中配置 Basic Auth 密码认证保护特定目录访问

步骤 2:生成密码文件

使用 htpasswd 命令创建存储用户名和加密密码的文件,文件路径建议放在 Nginx 配置目录内。

执行 htpasswd -c /etc/nginx/.passwd admin 输入两次密码。

注意:-c 参数仅在首次创建文件时使用,追加新用户时去掉 -c,否则会清空原有用户。

执行 chmod 640 /etc/nginx/.passwd 限制文件权限,确保仅 Nginx 进程用户可读。

步骤 3:修改 Nginx 配置

打开 Nginx 配置文件,通常在 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 下的站点配置文件中。

在需要保护的 location 块内添加 auth_basic 和 auth_basic_user_file 指令。

示例配置:

server {
    listen 80;
    server_name example.com;

    location /admin/ {
        auth_basic "Admin Area";
        auth_basic_user_file /etc/nginx/.passwd;
        # 其他配置...
    }
}

步骤 4:检查并重载

如何在 Nginx 中配置 Basic Auth 密码认证保护特定目录访问

执行 nginx -t 确认配置语法无误,出现 successful 提示后再执行 nginx -s reload 应用更改。

若 nginx -t 报错,检查密码文件路径是否正确,或是否存在拼写错误。

怎么验证是否生效

通过浏览器和命令行工具双重验证,确保认证机制正常工作且无权限泄露。

浏览器验证:在无痕模式下访问 http://example.com/admin/,页面应立即弹出用户名密码输入框。输入错误密码应显示 401 Authorization Required 页面。

命令行验证:使用 curl 命令模拟请求。

未带凭证访问:curl -I http://example.com/admin/ 应返回 HTTP/1.1 401 Unauthorized。

带正确凭证访问:curl -u admin:password http://example.com/admin/ 应返回 HTTP/1.1 200 OK。

带错误凭证访问:curl -u admin:wrongpass http://example.com/admin/ 应返回 HTTP/1.1 401 Unauthorized。

常见坑

配置过程中容易忽略权限设置和传输加密,导致安全隐患或服务不可用。

如何在 Nginx 中配置 Basic Auth 密码认证保护特定目录访问

密码文件权限过大:若 /etc/nginx/.passwd 文件对所有用户可读,存在密码哈希泄露风险。务必执行 chmod 640 并将属组设为 nginx 或 www-data。

未启用 HTTPS:Basic Auth 的密码仅经过 Base64 编码,未加密传输。在 HTTP 环境下,抓包即可还原密码。生产环境必须配置 SSL 证书,强制 HTTPS 访问。

配置层级冲突:若在 server 块开启了 auth_basic,但在某个 location 块想取消认证,需显式设置 auth_basic off;,否则子目录会继承父级配置。

常见问题

如何添加多个用户?

再次运行 htpasswd 命令但不加 -c 参数即可追加用户。

执行 htpasswd /etc/nginx/.passwd user2 输入新密码,原有用户保留,新用户生效。

如何取消某个目录的认证?

在该 location 块中显式关闭 auth_basic 继承。

添加 auth_basic off; 指令,Nginx 会停止对该 location 及其子目录的认证要求。

忘记密码文件路径怎么办?

在 Nginx 配置文件中搜索 auth_basic_user_file 指令查找路径。

执行 grep -r "auth_basic_user_file" /etc/nginx/ 可快速定位配置文件和文件路径。

参考来源

Nginx Official Documentation, Module ngx_http_auth_basic_module, http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html