nginx常用模块

1、access模块

简介

访问控制模块,该模块可以实现简单的防火墙功能,过滤特定的主句,这个模块在我们编译nginx时会默认编辑进nginx的二进制文件中;

语法:
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

allow:允许访问的ip或者网段

deny:拒绝访问的ip或者网段

规则
从语法上看,它允许配置在http指令块中,server指令块中还有locatio指令块中,这三者的作用域有所不同。
	如果配置在http指令段中,将对所有server(虚拟主机)生效;
	配置在server指令段中,对当前虚拟主机生效;
	配置在location指令块中,对匹配到的目录生效。
ps: 如果server指令块,location指令块没有配置限制指令,那么将会继承http的限制指令,但是一旦配置了会覆盖http的限制指令。
	或者说作用域小的配置会覆盖作用域大的配置。
实验

对单个ip进行限制访问

各种模块的功能都需要修改配置文件才能使用

我们可以在http指令块中设定

  • http指令块中,是全部禁止的,所以包括其他的虚拟主机
  • 被deny的ip都无法访问;
#在http指令块中设定nginx
[root@node-130 nginx]# vim conf/nginx.conf

......
http {
    include       mime.types;
    default_type  application/octet-stream;
        deny 192.168.75.131;			#直接在这里新增deny的ip
....


#重载配置文件后验证
[root@node-130 nginx]# nginx  -s reload


#访问被禁止了
[root@node1 ~]# curl 192.168.75.130
<html>	
<head><title>403 Forbidden</title></head>		#注意这个是403报错,禁止访问的意思
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>

#自己本机访问就不会被禁止
	#加上-I可以看到更多的信息
[root@node-130 nginx]# curl 192.168.75.130 -I
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Sun, 20 Jun 2021 09:20:19 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 22
Last-Modified: Sun, 20 Jun 2021 08:13:51 GMT
Connection: keep-alive
ETag: "60cef8bf-16"
Accept-Ranges: bytes

在server上配置禁止访问

  • 如果在server配置deny就等于禁止ip去访问这个网站,
  • 一个server是一个网站的意思
  • 也可以禁止一个网段,deny 192.168.75.0/24
  • 不要忘记配上掩码值;
#修改配置文件
[root@node-130 nginx]# vim conf/nginx.conf
....
    server {
        listen       80 default_server;
        server_name  localhost;
        deny 192.168.75.0/24;

#重载配置文件
[root@node-130 nginx]# nginx -s reload


#验证
	#本机访问默认网页都被禁止了
[root@node-130 nginx]# curl 192.168.75.130
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>

#访问其他的虚拟主机是可以的
[root@node1 ~]# curl 192.168.75.135
this 是blog.liangjiawei.net

也可以在localtion指令块中配置

  • 这种配置是最多的,直接限制网站的某个目录
  • 这种也可以配合白名单设置;allow选项
  • allow配置中,可以允许那些ip是可以访问的;
#对于一个目录进行访问限制
	#先修改配置文件
		#注意两个allow和deny的顺序不要搞混了,不然无法访问
[root@node-130 nginx]# vim conf/nginx.conf
..........
        location /haha {
                allow 192.168.75.130;		#开通白名单,只允许本机访问
                deny all;			#所有的ip都无法访问这个目录
                root /data/;
                index index.html index.htm;
        }

.......

#创建名单资源
[root@node-130 nginx]# nginx -s reload
[root@node-130 nginx]# mkdir -p /data/haha
[root@node-130 nginx]# echo "这是秘密内容" > /data/haha/index.html

	
#验证访问
[root@node-130 nginx]# nginx -s reload
	#本机访问是可以的
[root@node-130 nginx]# curl 192.168.75.130/haha/index.html
这是秘密内容

#其他无法访问
[root@node1 ~]# curl 192.168.75.130/haha/index.html
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>

2、auth_basic模块

简介:

这个模块是用户认证模块,可以对访问的目录进行加密,并且需要用户验证,才能查看;

功能是由ngx_http_auth_basic_module模块提供的;

这个玩意在编译编译nginx的时候见过;默认会编译好的

[root@node-130 nginx-1.17.10]# ./configure --help |grep ngx_http_auth_basic
  --without-http_auth_basic_module   disable ngx_http_auth_basic_module
语法讲解
Syntax: 		auth_basic string | off;			#语法是否开关
Default: 		auth_basic off;						#默认是管的
Context: 		http, server, location, limit_except	#可以配置的地方
Syntax: 		auth_basic_user_file file;		#这里是指定了用户文件
Default: 		—								#需要自己配置的
Context: 		http, server, location, limit_except	#可以配置的地方
解释:

认证的配置可以在http指令块、server指令块和location模块中配置

auth_basic string:这个是定义了认证的字符串,会通过相应报文返回给客户端,也可以通过这个命令关闭认证

auth_basic_user_file file:是一个认证文件;

认证模块的实验

实验的计划:

  • 对指定的目录进行加密
  • 需要使用命令生成认证文件
#修改配置文件,然后对指定的目录进行加密
[root@node-130 ~]# vim /usr/local/nginx/conf/nginx.conf
.............
	#自己添加内容
        location /img {
                root    /data/;
                auth_basic "User Auth";	#这个是指定文件名字
                auth_basic_user_file /data/auth.passwd;	#这个是用户认证的文件存放的路径
          		autoindex on;      
        }

准备加密目录和加密的文件文件

[root@node-130 ~]# mkdir -p /data/img/
[root@node-130 ~]# mkdir -p /data/img/
[root@node-130 ~]# touch /data/img/a.txt
[root@node-130 ~]# yum -y install httpd-tools 


#生成用户密码
	#-c:指定了用户文件的位置,liangjiawei是用户名,需要输入两次密码
[root@node-130 ~]# htpasswd -c /data/auth.passwd liangjiawei
New password: 
Re-type new password: 
Adding password for user liangjiawei

重启服务验证

[root@node-130 ~]# nginx -s reload

浏览器输入192.168.75.130:/img

–>输入用户:liangjaiwei

–>输入密码:1

nginx toa 模块 nginx常用模块介绍_nginx toa 模块

这个实验是可以直接在server上做;

  • 限制访问首页,需要用户授权登陆才能访问
htpasswd命令

作用:生成用户认证;htpasswd - Manage user files for basic authentication

语法:htpasswd+【选项】+用户名

选项

  • -c:创建一个加密文件;
  • -m:默认采用MD5算法对密码进行加密;
  • -d:采用CRYPT算法对密码进行加密;
  • -p:不对密码进行进行加密,即明文密码;
  • -s:采用SHA算法对密码进行加密;
  • -b:在命令行中一并输入用户名和密码而不是根据提示输入密码;
  • -D:删除指定的用户。
#生成用户密码
	#用户名和密码都可以直接指定,但是不安全;history命令会记录 起来;
[root@node-130 ~]# htpasswd -b /data/auth.passwd  huangzhiming 1
Adding password for user huangzhiming

#更新密码
[root@node-130 ~]# htpasswd -b /data/auth.passwd  huangzhiming 2
Updating password for user huangzhiming


#删除用户
[root@node-130 ~]# htpasswd -D /data/auth.passwd  liangjiawei
Deleting password for user liangjiawei

3、stub_status模块

简介

状态查看模块,这个模块主要是给管理员查看,

可以输出nginx的基本状态信息

通常可以结合访问控制模块进行配合使用

语法:
Syntax: stub_status;
Default: —
Context: server, location
实验

如果想要实现这个功能,需要看编译的参数

默认是没有编译额;

#默认是没有帮我们编译的
[root@node-130 nginx-1.17.10]# ./configure --help | grep stub_status
  --with-http_stub_status_module     enable ngx_http_stub_status_module

[root@node-130 nginx-1.17.10]# nginx -V
nginx version: nginx/1.17.10
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx

需要重新编译,并且添加模块

#进入到源码目录
[root@node-130 ~]# cd /usr/src/nginx-1.17.10/

#预编译
[root@node-130 nginx-1.17.10]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module 

#编译安装
[root@node-130 nginx-1.17.10]# make && make install

#直接升级
[root@node-130 nginx-1.17.10]# make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

#查看就是添加了模块
[root@node-130 nginx-1.17.10]# nginx -V
nginx version: nginx/1.17.10
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module

修改配置文件,使用status状态模块

#进入到目录并且修改配置文件
[root@node-130 nginx-1.17.10]# cd /usr/local/nginx/
...........
	#空白处新增加这一行	
        location = /status {		#这里的目录是不用创建的
                stub_status;					#启用了状态模块
                allow 192.168.75.130;		#只允许本机访问、白名单
                deny all;				#拒绝所有;
        }
..........

#重载配置文件验证
[root@node-130 nginx]# nginx -s reload

#其他服务器无法看到
[root@node1 ~]# curl 192.168.75.130:/status
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.10</center>
</body>
</html>

#本机可以看到
[root@node-130 nginx]# curl 192.168.75.130:/status
Active connections: 1 
server accepts handled requests
 2 2 2 
Reading: 0 Writing: 1 Waiting: 0
stub_status模块的输出信息

Active connections:当前活动状态的连接数

accepts:统计总值,已经接受的客户端请求的总数

handled:统计总值,已经处理完成的客户端请求的总数

requests:统计总值,客户端发来的总的请求数

Reading:当前状态,正在读取客户端请求报文首部的连接的连接数

Writing:当前状态,正在向客户端发送响应报文过程中的连接数

Waiting:当前状态,正在等待客户端发出请求的空闲连接数

4、referer模块

简介

referer模块可以进行防盗链设置;

那么什么是防盗链?

盗链的含义是网站内容本身不在自己公司的服务器上,而通过技术手段,直接调用其他公司的服务器网站数据,而向最终用户提供此内容。

语法:
Syntax: valid_referers none | blocked | server_names |
string ...;
Default: —
Context: server, location
  • valid_referers:有效的尹永祥
  • none:没有
  • blocked:阻塞
  • server_names:域名
  • 可以设置在server或者location中
防盗链设置的实验

首先编写一下配置文件,指定一下规则

#修改配置文件
[root@node-130 nginx]# vim conf/nginx.conf
		#新增加一下内容:
........
        location ~* \.(gif|jpg|png|swf|flv)$ {
                valid_referers none blocked *.liangjiawei.net;
                root    /data/html/;
                if ($invalid_referer) {
                        return 403;
                        }
                }

增加的内容解释

valid_referers 表示合法的referers设置
none: 表示没有referers,直接通过浏览器或者其他工具访问。
blocked: 表示有referers,但是被代理服务器或者防火墙隐藏;
*.liangjiawei.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机。

#这个是判断,如果有违规的访问就会访问403;
                if ($invalid_referer) {
                        return 403;
                        }
#这个是代表以什么什么结尾
	location ~* \.(gif|jpg|png|swf|flv)$

准备服务器端的图片资源数据

#查找一下linux下的.jpg结尾的资源
[root@node-130 nginx]# find / -name "*.jpg"
/root/mysql-5.5.60/libmysqld/examples/builder-sample/snapshot.jpg
/root/mysql-5.5.60/packaging/WiX/AdminBackground.jpg
/root/mysql-5.5.60/packaging/WiX/AdminHeader.jpg
/usr/share/backgrounds/morning.jpg
/usr/share/backgrounds/night.jpg
/usr/share/backgrounds/day.jpg
/usr/share/backgrounds/default.jpg
/usr/share/kde4/apps/ksplash/Themes/CentOS7/2560x1600/background.jpg
/usr/share/wallpapers/CentOS7/contents/images/2560x1600.jpg


#随便复制一张到html文件中
[root@node-130 nginx]# cp -a /usr/share/backgrounds/night.jpg html/

本机尝试访问

nginx toa 模块 nginx常用模块介绍_html_02

准备另外一台服务器,准备引用这台服务器的资源

  • 另外一台服务器也要配置nginx
  • 也需要引用130服务器的night.jpg图片
#直接修改131服务nginx的主页文件
[root@node1 nginx-1.17.10]# > /usr/local/nginx/html/index.html 
[root@node1 nginx-1.17.10]# vim /usr/local/nginx/html/index.html 
<html>
<h1>welcome to liangjiawei.net<h1>
<img src="http://192.168.75.130/night.jpg"
</html>

重载131的nginx配置文件验证

[root@node1 nginx-1.17.10]# /usr/local/nginx/sbin/nginx

nginx toa 模块 nginx常用模块介绍_nginx_03

5、autoindex模块

nginx默认的输出页面是不允许列出整个目录的内容的;

如果想要列出内容需要添加autoindex模块

默认的输出是:

[root@node-130 nginx]# curl 192.168.75.130
这个是默认主页

如果开启了autoindex模块

  • 原来在html的index这个文件需要移走
#编写配置文件
[root@node-130 nginx]# vim conf/nginx.conf
........
        location / {
            root   html;
           # index  index.html index.htm;
                autoindex on;
        }
..........

#重载配置文件,并且验证
[root@node-130 nginx]# nginx -s reload

#创建数据
[root@node-130 nginx]# mv html/index.html  /tmp/
[root@node-130 nginx]# touch html/{a..c}.txt

浏览器输入ip–>查看效果

nginx toa 模块 nginx常用模块介绍_html_04

autoindex模块的其他显示

# 开启目录访问权限
autoindex on;
# 以人类易懂的方式显示文件大小
autoindex_exact_size off;
# 文件时间设置为本地时间
autoindex_localtime on;