nginx 账号
Nginx也能管账号?从基础认证到安全防护,一篇搞定
刚接手一个老项目的服务器时,我发现后台管理目录居然直接暴露在公网——输入网址就能看到登录界面,甚至连密码都明文存储。吓得我连夜给Nginx加了账号认证,现在不仅访问安全了,连运维同事都夸我“开窍了”!
一、基础款:Nginx自带的“密码锁”(HTTP Basic Auth)
如果你的网站有后台管理目录(比如/admin),或者需要限制某些资源的访问,最简单的方式是用Nginx自带的HTTP Basic Auth——不需要额外安装组件,几行配置就能搞定。
1. 生成加密密码文件
首先得用htpasswd生成密码文件(不同系统可能需要先安装apache2-utils):
# Ubuntu/Debian
sudo apt install apache2-utils
# CentOS/RHEL
sudo yum install httpd-tools
# 生成密码文件(-c表示创建新文件,admin是用户名)
htpasswd -c /etc/nginx/auth/passwords admin
输入密码后,Nginx会自动把密码用BCrypt算法加密(别担心,比明文安全100倍!),生成的passwords文件只有root权限可读。
2. 配置Nginx认证
在nginx.conf或站点配置文件中添加以下代码:
server {
listen 80;
server_name yourdomain.com;
location /admin { # 要保护的目录
auth_basic "请输入账号密码"; # 登录弹窗的提示文字
auth_basic_user_file /etc/nginx/auth/passwords; # 密码文件路径
root /var/www/html; # 站点根目录
}
}
重启Nginx后,再访问/admin目录,就会弹出登录框,没密码的人直接401“请离开”!
二、进阶玩法:对接LDAP/OAuth,企业级账号管理
如果公司有统一的账号系统(比如LDAP或OAuth),Nginx可以直接“借用”这些账号,不用单独维护密码。
1. LDAP集成(适合企业内部系统)

用ngx_http_auth_ldap_module模块(需要提前编译安装),配置示例:
location /internal {
auth_ldap "LDAP认证";
auth_ldap_servers "ldap://ldap.example.com:389"; # LDAP服务器地址
auth_ldap_binddn "cn=admin,dc=example,dc=com"; # 绑定用户
auth_ldap_binddn_passwd "password"; # 绑定密码(也可写死在变量中)
auth_ldap_require "memberOf=cn=admins,ou=groups,dc=example,dc=com"; # 限制权限组
}
这样员工直接用公司AD账号就能登录,IT部门再也不用给服务器单独开账号了!
2. OAuth/SSO集成(适合第三方应用)
比如对接微信/钉钉登录,可借助ngx_http_auth_pam_module或第三方认证模块(如Auth0、Keycloak)。核心逻辑是:用户访问时跳转到OAuth平台登录,验证通过后Nginx直接放行,适合“免密码”场景。
三、安全防护:这些坑千万别踩!
- 密码别裸存:
auth_basic_user_file必须用root权限,文件权限设为600(chmod 600 /etc/nginx/auth/passwords),防止其他用户读取。 - HTTPS是刚需:HTTP下密码会被中间人攻击截获,一定要用
listen 443 ssl开启HTTPS,让密码在加密通道中传输。 - 最小权限原则:只给需要访问的目录加认证,别把整个站点锁死;后台目录用
location单独隔离,别和主站混在一起。 - 定期“体检”:每月检查密码文件大小,超过100个用户建议用LDAP;密码过期自动强制更新,避免“僵尸账号”长期占用权限。
四、常见问题及解决办法
- 401错误? 检查密码文件路径是否正确(比如写成
/etc/nginx/passwords但实际是/etc/nginx/auth/passwords),或权限不够(chmod 644会导致401,必须600)。 - 密码改了咋更新? 改完
htpasswd文件后,Nginx会自动读取新密码(不用重启,直接生效)。 - 访问白屏? 检查
auth_basic_user_file指向的文件是否存在,或站点配置的root路径是否和auth_basic作用域冲突。
最后想说
Nginx管账号不是“噱头”,而是服务器安全的第一道防线。从小项目的单用户密码,到企业级的LDAP集成,选对方式就能把“后门”变成“铜墙铁壁”。现在就打开你的Nginx配置文件,给后台目录加把“安全锁”吧!如果踩坑了,评论区喊我,帮你出解决方案~




