nginx可通过http基础认证实现访问控制,需先用htpasswd或openssl生成密码文件,再在server或location块中配置auth_basic和auth_basic_user_file指令,并通过nginx -t验证后reload生效。

如果您希望为Nginx托管的网站或特定目录启用访问控制,防止未授权用户直接浏览内容,则需要配置HTTP基础认证(Basic Auth)。以下是实现该功能的具体操作步骤:
一、生成密码文件
基础认证依赖于一个包含用户名和加密密码的文件,通常使用Apache工具htpasswd生成。该文件不被Web服务直接解析,仅由Nginx读取验证。
1、确认系统中已安装apache2-utils包(Ubuntu/Debian)或httpd-tools(CentOS/RHEL)。
2、执行命令创建密码文件并添加用户:sudo htpasswd -c /etc/nginx/.htpasswd admin。
3、按提示两次输入密码,完成后会在/etc/nginx/目录下生成.htpasswd文件。
4、如需添加其他用户,省略-c参数运行相同命令:sudo htpasswd /etc/nginx/.htpasswd user2。
二、修改Nginx配置启用认证
在目标server块或location块中引入auth_basic指令,指定认证区域名称及密码文件路径,使Nginx在响应前校验凭证。
1、打开对应站点的Nginx配置文件,例如:sudo nano /etc/nginx/sites-available/example.com。
2、在server块内定位到需要保护的location块,如需保护整个站点则修改根location / {}。
3、在该location块中添加两行配置:auth_basic "Restricted Area";。
4、紧接着添加:auth_basic_user_file /etc/nginx/.htpasswd;。
三、测试配置并重载服务
语法正确性验证可避免因配置错误导致Nginx无法启动,重载操作确保新规则即时生效且不中断现有连接。
1、检查Nginx配置语法是否合法:sudo nginx -t。
2、若输出显示“syntax is ok”和“test is successful”,则继续下一步。
3、重新加载Nginx配置:sudo systemctl reload nginx。
4、访问对应URL,浏览器将弹出认证对话框,输入此前设定的用户名和密码即可进入。
四、限制特定IP同时启用认证
在部分场景中,需对非内网IP强制认证,而允许本地调试免密访问,可通过satisfy指令组合实现权限叠加控制。
1、在目标location块中添加:satisfy any;。
2、添加白名单规则:allow 127.0.0.1;。
3、添加拒绝其他所有地址的规则:deny all;。
4、保留原有auth_basic相关配置,确保未匹配白名单的请求仍触发认证流程。
五、使用OpenSSL手动创建密码条目
当系统未安装htpasswd工具时,可借助OpenSSL命令生成兼容格式的密码行,写入.htpasswd文件实现等效效果。
1、生成MD5加密密码字符串:printf "admin:$(openssl passwd -apr1 your_password)" > /etc/nginx/.htpasswd。
2、若需追加用户,改用>>重定向符并替换用户名与密码部分。
3、确保文件权限严格:sudo chmod 640 /etc/nginx/.htpasswd。
4、确认Nginx主进程用户(通常为www-data或nginx)对该文件具有读取权限。










