开发者学堂课程【Nginx 企业级 Web 服务实战:Nginx location 基础使用、四层访问控制、账户认证及自定义日志路径】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/649/detail/10757
Nginx location 基础使用、四层访问控制、账户认证及自定义日志路径(三)
四、Nginx 四层访问控制
1、nginx 有很多小功能,比如四层访问控制、用户认证等。四层访问控制可以让nginx 的某些路径禁止某些人访问,有一些比较重要的监控页面,不想让互联网的人访问,那么就可以通过 allow deny 设置一些禁止网络来禁止别人访问。
location /about {
alias /data/nginx/html/pc;
index index.html;
deny 192.168.1.1;
allow192.168.1.6/24;
allow 10.1.1.0/16;
allow 2001:edb8::/32;
deny all;
}
比如这里 uri 比较重要,那就设置一个 deny ,后面还有 all,
就是先允许一个或者多个人来访问,后面只允许经过准许的人访问,第一个要 deny,先把这个人 deny 掉,不让他访问。
一个网站有多个地址,想把这一个地址当中的某个人去掉,那就只能先把这个网站当中的某个地址禁止,禁止完之后再把网站放进来,不让192.168.1.1这个访问,用户访问过来之后,先看是不是192.168,1.1,如果是的话就拒绝,如果不是那就走下面那个。然后再往下,把192.168.1.6/24放开,再往下把10.1.1.0/16放开,再往下其他人全拒绝,这个人再往前进去。
2、有个102的服务器,先允许这个服务器
location ~*\.(gif | jpg |jpeg | bmp| png | tiff | tif | ico| wmf | js) $ {
root /data/nginx/images1;
index index.html;
}
如果这个图片不让102访问,直接加 deny 就可以,deny 172.20.0. 102,直接拒绝,然后 reload,在 reload 之前应该可以访问到这个地址。
3、访问图片1.jpg,在102 上 curl 一下,现在是可以访问的。写 host 文件,编辑 etc ,hosts 加个本地解析,把 www.magedu.net 解析到172.20. 0.101,把这个域名加上去,之后再重新拷一下。只看头部信息就可以,这个是成功的,成功之后加上禁止202系统,再加上 allow 允许其他人,地址段可以再写个172.20.0.100,把45级再放开,放开之后,再把其他人全拒绝,也就是写个默认策略 deny all,把其他人全拒绝。
location ~*\.(gif | jpg |jpeg | bmp| png | tiff | tif | ico| wmf | js) $ {
root /data/nginx/images1;
index index.html;
deny 172.20.0.102;
allow 172.20.0.100;
deny all
}
这个结果就是把172.20.0.102这个地址拒绝了,拒绝之后再把172.20.0.100这个地址放开,放完之后再把其他所有人全拒绝。顺序可以自己写,这里只是演示一下。重新reload,reload 之后,这个172.20.0.102就访问不了了,它被拒绝了,被拒绝之后45级是可以访问的,其他人都访问不了,因为默认策略就是拒绝的。
4、在现实中 deny 172.20.0.102这种服务不会在这里设置,而是设置到 nginx 监控页面, allow 172.20.0.100后面可加码,比如这个后面是16位的。
公司里面一些特殊的地方才会用到这个,一般是 nginx 状态页,在状态页就会基于这个方式只允许本地访问,或者只允许内网的人来访问这个状态页,否则所有人都能拿到 nginx 状态,这个就不完全了。
五、Nginx用户认证
1、有些 uri 是公司内部的业务系统,这些业务系统可能本身没有提供登录认证的功能,也正好是基于 nginx 来做反向代理,这个时候就可以用 nginx 来实现这种反向代理。
比如后面有一个示例,日志收集 ELK 这个服务比较特殊,它本身没有提供认证的功能,只要知道这个地址的人都可以去访问,这个肯定是不安全的,所以在前面加个nginx,让 nginx 做反向代理,然后让 ELK 那些外部界面或者业务的外部系统监听在本地上,不能从外网访问。在这个服务器上再装个 nginx 做反向代理,让 nginx 去监听端口。当访问到这个服务器的80端口或者其他端口的时候,就转换到127.0.0.1这个业务的接端口上,然后在 nginx 上做认证,这样再访问这个业务系统,就必须做认证,否则就不能成功登录。
3、装一个工具,这个工具在 centos 上叫 httpd-tools,在 ubuntu 上叫 apache2-utils,这个名称是不一样的,装完之后就有 htp 这个命令了,再使用 htpasswd- bc生成一个认证文件,-m 可以不加,它是指定算法的,加-bc 就行了。
生成的认证文件可以通过 htpasswd-h 看一下,-c 创建个新文件,-b 指定密码,在命令行上输入密码,-m 使用 MD5 进行加密。-m 可以不加,它默认就是这个,所以就用 htpasswd- bc 创建一个认证文件,认证文件就放在 apps/nginx/conf 里。假如叫. htpasswd,后面给用户名和密码,这个密码就写123456
-bc /apps/nginx/conf/.htpasswd magedu 123456
创建好之后要验证一下这个文件里面有没有,它是使用 MD5 加密。复制粘贴一下,再写个用户名是 ubuntu
-b/apps/nginx/conf/.htpasswd ubuntu123456
这个就不用加 c 了,因为加c就把之前类似的覆盖了,这个时候就有两个账号了,一个 magedu一个ubuntu。
3、用 nginx 去调用这个认证文件,编辑一下配置文件
vim/apps/nginx/conf.d/inux39-pc.com
再写个 log in,假如是个医务系统,需要登录。写个 location 根下 log in,如果访问这个页面的时候,就要求去登录,写个 root,在 data 下的 nginx,再写个 html,在这里面创建一个 log in目录
location /login {
root /data/nginx/html;
index index.html;
}
这个录音的目录不登录是看不到的,也就相当于有些业务系统必须经过 nginx 认证以后才能通行,否则就被禁止了,不加 login 是可以访问的。把 log in 这个目录创建一下/data/nginx/html/login,然后 echo个值,这是一个 login 的 pages,把这个追加到刚才路径下的 index.html
echo“login pages”> ///data/nginx/html/log in/index.html
因为下面是没有写任何东西的,所以它有空,有空就没关系。然后 reload,没有加认证的时候是可以直接访问的,但是如果加上就不能访问了。由于 location 比较重要,不允许别人看到,所以要加上认证 auth_basic, auth_basic_user_file,登录这个界面会有输入密码的提示。auth_basic_user_file 要指定一个认证文件,把这个放上就可以
location /login {
root /data/nginx/html;
index index.html;
auth_basic “login password”
auth_basic_user_file apps/nginx/conf/.htpasswd
}
4、这个一般用于公司内部的一些小系统,真正给客户端或者互联网用户使用的不会用这种认证方式。因为这个账号名和密码得自己写,太低级了。这个认证没有自己的数据库认证,一般的业务系统都会有个数据库,把账号名和密码信息放到 MySQL 里面,会有认证的服务,至少要检查一下账号和密码是否正确,如果正确就允许登录,错误就拒绝。一般是这样的,这个只是用于公司内部的一些小系统
5、把认证文件的路径改一下。拿到 apps/nginx/conf/.htpasswd 这个认证文件,有的人喜欢把权限改成640,改成600也行,但是不改也没关系也能用。这次把它加上,加上后再刷新,刷新之后就不能登陆了,要是强制登陆就会报401,需要有个认证,所以还得登陆, magedu、ubuntu 这两个账号都可以登,这个认证比较简单,两个用户不能实现不同的权限,给不同用户分配不同权限的功能,得通过程序来实现,通过 MySQL 把这个权限读出来,读出来之后通过动态程序加载不同的页面,然后生成不同权限,这个得结合开发。但是 nginx 这个功能被用的次数还是比较多的,上课的时候放的歌就是 nginx 二次开发版来实现的,这是一个音乐播放网站,
比如上网搜野狼 disco,点下载,这个歌曲就可以下载了,这个是拿 Tengine 来做的。