一、用户访问控制模块ngx_http_access_module
如果在Nginx中想控制某个路径无法让指定用户访问(限制IP访问),需要使用到的模块是ngx_http_access_module。说模块名可能不熟悉,但是说到allow和deny就一定知道是干什么的了。这个模块是默认就会安装的,除非在编译时加上了--without-http_access_module。下面是ngx_http_access_module的配置语法示例:
location / {
deny 192.168.1.120;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
Nginx和iptables的匹配规则一样,从上往下进行匹配,只要遇到符合条件的规则就不再继续往下匹配。如上例子中首先禁止192.168.1.120这个IP的访问,然后允许了另外2个网段的IP访问,最后不符合匹配条件的IP全部禁止访问。在实际工作中只要记住想禁止哪个IP访问就deny掉对应的IP,想允许则加上allow ip,想禁止或者允许所有的IP访问就使用allow all或者deny all。
二、用户认证模块ngx_http_auth_basic_module
Nginx进行用户名密码验证的话是通过ngx_http_auth_basic_module模块实现,该模块可作用范围http,server,location,limit_except,语法如下:
location / {
auth_basic "Please input your name";
auth_basic_user_file /etc/nginx/htpasswd;
}
设置后的效果如下:
设置步骤:
由于认证文件需要通过htpasswd命令,所以需要先安装httpd-tools这个工具,然后使用该命令建立登录文件及用户名密码,第一次创建需要加-c选项,之后新增用户时不用再加-c,-m代表md5加密,然后就是指定文件路径及最后的用户名密码了
创建好了后修改nginx.conf文件,引用模块,并指定文件路径,也就是上一步时创建的路径,然后访问location指定的路径时就会弹出窗口需要用户名密码才可以登录了
http_auth_basic_module有一个局限性就是用户信息依赖于文件,如果想避免这个问题的话就需要考虑Nginx与LUA结合实现高效验证;或者利用nginx_auth_ldap模块实现与LDAP结合。