Nginx添加HTTP密码认证
为什么要给nginx添加密码认证?
为了方便,我们有时候可能会放一些监控脚本在默认的域名下,比如放个phpinfo.php
,用于查看php的信息等等,但这个又不想被别人直接访问,而且也不想写个什么登录界面,这时,我们就可以直接用nginx的身份认证功能。
添加了认证是什么效果?
开启了身份认证,访问的时候就需要输入账号和密码。
如果不输入点取消,则会显示需要认证。
怎样添加认证?
把以下两句放在nginx配置文件中的server下或者location里面
auth_basic 'Restricted'; # 认证名称,随意填写
auth_basic_user_file /usr/local/nginx/htpasswd; # 认证的密码文件,需要生成。
其中/usr/local/nginx/htpasswd
是账号密码文件,使用htpasswd
命令生成,其中最后两个参数是用户名和密码,到时需要登录的时候就是用这个用户名和密码。
htpasswd -bc /usr/local/nginx/htpasswd zhangsan 123456
如果你服务器没有htpasswd
命令,请先安装,htpasswd
是apache的一个工具:
yum install -y httpd-tools
以下是我服务器放的例子,注意这不是一个完整配置文件,我只是指明身份认证的两句配置可以放在这个地方:
最后,需要重载一下nginx:
首先检查配置文件是否有语法问题:
sudo nginx -t
如下图,如果显示的是ok,successful,则是对的,如果是failed就说明语法有问题,需要检查一下,比如是否少写分号等等。
语法没问题再重载nginx:
sudo nginx -s reload
认证原理
nginx开启密码认证的原理是使用了HTTP authentication
认证机制的basic版HTTP basic authentication
,只要向客户端发送以下header即可触发浏览器弹出认证窗口(接收输入用户名和密码),其中『My Realm』可以改成任意其他自己喜欢的字符串:
WWW-Authenticate: Basic realm="My Realm"
HTTP/1.0 401 Unauthorized
其实HTTP authentication
认证机制还有另一种,叫HTTP digest authentication
,它比basic版的更安全,因为Basic版的认证方式在传输过程中采用的用户名密码加密方式为BASE-64,即类似『base64_encode(username:password)』这样加密的,其解码过程非常简单,如果被嗅探,密码几乎是透明的。
但nginx默认不支持更安全的digest认证方式,如果要支持,需要安装插件HTTP Digest Authentication。
使用编程语言实现HTTP authentication
前面已经说了nginx密码认证的原理是HTTP authentication,只需要发送一个http header即可触发浏览器弹出认证窗口,毫无疑问,随便找一门编程语言都可以发送一个header,这里我使用php作为示例:用PHP进行HTTP认证。
怎样退出呢?
最好的方法是关闭浏览器再打开,注意是关闭整个浏览器而不是只关闭一个标签,其他退出方式具体请参考How to log out user from web site using BASIC authentication?
博主,请教一个问题,比如我用 pic.xiebruce.top 这个域名搭建了Picuploader 图床,设置加密。但是在打开 http://www.xiebruce.top 同样会弹出身份认证框
应该如何解决?谢谢!
pic.xiebruce.top和www.xiebruce.top是两个不同的nginx配置文件,各自是一个
server
模块,你在server模块里添加了auth_basic
和auth_basic_user_file
这两个配置,它就会要求要身份验证,没添加就不会要求身份验证,其中一个不可能会影响到另一个,你是不是pic.xiebruce.top和www.xiebruce.top都添加了??