Nginx常用基础模块

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx常用基础模块相关的知识,希望对你有一定的参考价值。

Nginx目录索引

  • ngx_http_autoindex_module模块处理以斜杠字符("/")结尾的请求,并生成目录列表。
  • 当ngx_http_index_module模块找不到索引文件时,通常会将请求传递给目录索引模块。
用法一: 开启索引模块功能,如果index模块找不到/code目录下index.html文件时,不会报错403,会将/code目录下的目录结构生成一个目录列表传递给客户端。
cd /etc/nginx/conf.d/
vim game.conf
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;					# 解决乱码问题
        
        location / {
                root /code;
                index index.html index.html;
                autoindex on;					# 开启目录索引模块功能,如果我们不开启索引模块会报错403
                autoindex_exact_size off;			# 显示文件大小(kb,M等)
        }
}

mv /code/index.html /opt				# 移除索引文件
systemctl restart nginx					# 重启nginx服务

- 测试:
我们在浏览器中输入http://game.nana.com/,浏览器中会显示出服务器/code目录下的目录结构。
用法二: 创建目录索引列表
cd /etc/nginx/conf.d
vim autoindex.conf
server {
        listen 80;
        server_name module.nana.com;
        charset utf-8,gbk;					# 解决乱码问题
        
        location / {
                root /module;				# 我们在创建目录索引时,不需要在/module目录下创建index.html文件
                autoindex on;					
                autoindex_exact_size off;			# 显示文件大小(kb,M等)
                autoindex_localtime on;			# 记录本地时区(on是本地时间,off是UTC时间。UTC时间换算本地时间需要加上8个小时)
        }
}

mkdir -p /module/{centos,ubuntu,redhat}			# 创建目录中对应的文件
systemctl restart nginx

配置域名解析
C:\\Windows\\System32\\drivers\\etc
打开hosts文件,添加:
192.168.15.7		module.nana.com

- 测试:
我们在浏览器中输入http://game.nana.com/,浏览器中会显示出服务器/module目录下的目录结构。

案例

  • http://game.nana.com/添加一个http://game.nana.com/download/的目录索引。
1. 创建server层配置文件,并添加目录索引列表
cd /etc/nginx/conf.d
vim game.conf
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;							# 解决乱码问题	

        location / {
                root /code;
                index index.html index.html;
        }

        location /download {        	
        		root /mouldle;						# 将/mouldle/download目录下的目录结构生成一个目录列表
                # alias /module;					忽略/download,直接将module目录下的目录结构生成一个目录列表
                autoindex on;						# 开启目录索引模块功能
                autoindex_exact_size off;			# 显示文件大小(kb,M等)
                autoindex_localtime on;			# 记录本地时区(on是本地时间,off是UTC时间。UTC时间换算本地时间需要加上8个小时)
        }
}

2. 创建目录中对应的文件
cd /module/
mkdir download
mv centos/ redhat/ ubuntu/ download/	
		
3. 重启nginx服务
nginx -t
systemctl restart nginx		

- 测试:
我们在浏览器中输入http://game.nana.com/,浏览器会显示/code/index.html的游戏页面	
我们在浏览器输入http://game.nana.com/download/,浏览器会显示/module/download/目录下的目录结构	

Nginx状态监控

  • ngx_http_stub_status_module模块是提供对基本状态信息的访问。
  • 默认情况下不构建此模块,应该是要–with-http_stub_status_module 配置参数启用它。
nginx -V								查看nginx安装默认自带的模块
# --with-http_sub_module					使用yum安装的nginx默认会构建此模块,如果源码编译安装需要增加这个模块

1. 修改配置文件
vim /etc/nginx/conf.d/game.conf
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;

        location / {
                root /code;
                index index.html index.html;
        }

        location /nginx_status {				
                stub_status;					# 启用状态监控模块,nginx状态监控模块产生的页面是官方自动生成的	
        }
}

2. 重启nginx服务
nginx -t				
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl restart nginx

3. 测试
打开浏览器,输入http://game.nana.com/nginx_status,可以查看到nginx的状态页面。

- nginx 状态页面
Active connections: 2 
server accepts handled requests
		2 		2 		17 
Reading: 0   Writing: 1   Waiting: 1 

Active connections			当前活动客户端的连接数,包括Waiting等待连接数。
accepts						已接受总的Tcp连接数
handled						已处理总的Tcp连接数
requests					客户端总的http请求数
	
Reading						当前nginx读取请求头的连接数
Writing						当前nginx将响应写回客户端的连接数
Waiting						当前等待请求的空闲客户端连接数

注意:一次Tcp的连接,可以发起多次http的请求,如下参数可配置进行验证
vim /etc/nginx/nginx.conf		
keepalive_timeout 0;			类似于关闭长连接
keepalive_timeout 65;			65s没有活动则断开连接

Nginx访问控制

基于IP的访问控制

  • ngx_http_access_module模块允许限制对某些客户端地址的访问
vim /etc/nginx/conf.d/game.conf
1. 拒绝指定的IP访问该网站的/nginx_status,其他的IP全部允许访问
location /nginx_status {
        stub_status;
        deny 192.168.15.7/24;			# 拒绝192.168.15.7访问
        allow all;						# 允许所有的地址访问
}

2. 只允许指定的来源IP能访问/nginx_status,其他的网段全部拒绝
location /nginx_status {
        stub_status;
        allow 192.168.15.7/24;			# 允许192.168.15.7访问
        deny all;						# 拒绝所有的地址访问
}

3. 实际在配置监控Nginx状态时,仅允许该服务的回环地址访问127.0.0.1
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;

        location / {
                root /code;
                index index.html index.html;
        }

        location /nginx_status {
                stub_status;			
                allow 127.0.0.1;			# 允许本地回环地址访问
                deny all;					# 拒绝所有访问
        }
}

基于用户密码的访问控制

  • ngx_http_auth_basic_module模块允许使用HTTP基本身份验证,验证用户名和密码来限制对资源的访问。
1. 生成一个密码文件,密码文件的格式 name:password(密码必须是加密的密文形式)	
- 建议使用htpasswd命令,创建用户,生成加密密码
yum -y install httpd-tools

htpasswd -c -b /etc/nginx/auth_conf nana 123				# 创建一个nana:123的密码文件写入/etc/nginx/auth_conf文件中
# Adding password for user nana    
cat /etc/nginx/auth_conf 
# nana:$apr1$piy5/bQK$SM2n8SakYVk8KmTV0XSoF.

2. 配置Nginx,限制对应的资源
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;

        location / {
                root /code;
                index index.html index.html;
                auth_basic "please password!!!";			
                auth_basic_user_file /etc/nginx/auth_conf;			# 保存密码的路径(写绝对路径,相对路径(auth_conf)都可以)
        }

        location /nginx_status {
                stub_status;			
                auth_basic "please password!!!";
                auth_basic_user_file /etc/nginx/auth_conf;			# 保存密码的路径(写绝对路径,相对路径(auth_conf)都可以)
        }
}

- 测试
这样配置好之后,我们在浏览器访问http://game.nana.com/或者http://game.nana.com/nginx_status时,
需要输入先输入用户名和密码才能访问到对应的网站。

Nginx访问限制

经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来宽带的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,请求数,进行限制。

连接限制(限制Tcp协议)

  • ngx_http_limit_conn_module模块对于限制定义key的连接数,特别是来自单个IP地址的连接数。并非所有的连接都被计算在内,仅当连接已经读取了整个请求头时才计算连接。
1. 定义连接限制
vim /etc/nginx/nginx.conf
http {
	...
	limit_conn_zone $binary_remote_addr zone=addr:10m;			
	# 开辟一个新的空间,空间里面都时存储的一些ip地址,空间名字叫addr,分配10M的空间。
	...
	}

2. 调用连接限制
vim /etc/nginx/conf.d/game.conf
server {    
 		 location / {
 		  	...   
		    # 同一个时刻只允许一个客户端连接
		    limit_conn addr 1;				# 限制addr空间里面的ip地址,同一个时刻只允许一个客户端连接
		    ...	
        }
}

- 测试 
在同一个时刻同时用多个客户端去访问该服务器IP地址,只能有一个连接上,其他客户端的访问请求连接,都会默认返回503。

请求限制(限制Http协议)

  • ngx_http_limit_req_module模块对于限制定义key的请求的处理速率,特别单一的IP地址的请求的处理速率。
1. 定义请求限制
vim /etc/nginx/nginx.conf
http {
	...
	limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;		
	# 开辟一个新的空间,空间里面都时存储的一些ip地址,空间名字叫req_zone,分配10M的空间,请求的速率为每秒1个请求。
	...
	}

2. 调用请求限制
vim /etc/nginx/conf.d/game.conf
server {    
 		 location / {
 		  	...   
 		  	# 连接成功的客户端,每秒钟只处理一个请求
         	limit_req zone=req_zone burst=5 nodelay;	
     		# 限制req_zone空间里面的ip地址,请求的速度为每秒钟1个请求。允许延迟处理的请求个数为5,来不及处理的其他请求直接返回错误。
         	# burst(允许延迟处理的请求个数)		nodelay(直接拒绝来不及处理的请求,默认返回503)
         	limit_req_status 412;
         	# 将来不及处理请求(默认的响应状态码)503改成412。
         	...	
        }
}

- 压力测试
ab -n 50 -c 20 http://192.168.15.7/download/			总共发起50个请求(-n), 同时并发20个请求(-c)
# Complete requests:      50			总共发起了50个请求
# Failed requests:        44			没有处理的请求有44个

请求限速,如果请求数超过1,则后续全拒绝,会出现412的状态码,412的状态码会被error_page接收。
error_page接收到412状态码后,会将 /code/error.html文件的内容输出在浏览器上。

1. 修改配置文件
vim /etc/nginx/conf.d/game.conf
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
        listen 80;
        server_name game.nana.com;
        charset utf-8,gbk;
        limit_req zone=req_zone burst=5 nodelay;
        limit_req_status 412;
        error_page 412 /error.html;				# 文件必须要存在,如果不存在则报错404	
		# 注意/error.html指向第一个location /(/code/error.html),后续所有的412报错,都指向第一个/code/error.html。
		
        location / {
                root /code;
                index index.html index.html;
        }

        location /download {
                root /module;			# 如果我们在/module/download目录下也创建error.html,是无法生效的
                autoindex on;
                autoindex_exact_size off;
        }
}

2. 编辑输出在浏览器的内容
echo "你能慢一点吗,这谁顶得住!" > /code/error.html

- 测试
我们在浏览器输入http://game.nana.com/或者http://game.nana.com/download/,快速刷新,会显示"你能慢一点吗,这谁顶得住!"
  • 请求限制与连接限制的差别
    HTTP协议是建立在TCP协议基础之上的。假设我们同一时刻只允许一个客户端通过TCP协议连接至客户端,但是连接成功的客户端可以通过HTTP向服务端发起多次请求。所以我们对请求限制,会比对连接的限制更加的有效。
    我们在实际工作中,大部分对访问的限制都是使用请求限制。

Nginx Location

使用Nginx Location可以控制访问网站的路径,一个server可以有多个location配置,多个location的优先级该如何区分??

  • location匹配符
匹配符			匹配规则				  	  优先级
 =				精确匹配						1
 ^~				以某个字符串开头				2
 ~				区分大小写的正则匹配			3
 ~*				不区分大小写的正则匹配			4
 !~				区分大小写不匹配的正则			5
 !~*			不区分大小写不匹配的正则		6
 /				通用匹配,任何请求都会匹配到		7
  • 优先级测试
1. 创建配置文件
vim /etc/nginx/conf.d/test.conf
server {
        listen 80;
        server_name test.com;

        location / {
                default_type text/html;
                return 200 "location /";
        }

        location = / {
                default_type text/html;
               return 200 "location =/";
      }

        location ~ / {
                default_type text/html;
                return 200 "location ~/";
        }
}

2. 配置域名解析
C:\\Windows\\System32\\drivers\\etc
打开hosts文件,添加:
192.168.15.7		test01.com

- 测试
我们打开浏览器输入http://test.com/,通过测试可以得出
优先级: =/ 优先于 ~/ 优先于 /
  • location应用场景
通用匹配,任何请求都会匹配到
location / {
	...
}

严格区分大小写,匹配以.php结尾的都走这个location
location ~ \\.php$ {
	...
}

严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \\.jsp$ {
	...
}

不区分大小写匹配,只有用户访问.jpg\\.gif\\.png\\.js\\.css结尾的都走这个location
location ~* .*\\.(jpg|gif|png|js|css)$ {
	...
}

不区分大小写匹配
location ~* "\\.(sql|bak|tgz.gz|git)$" {
	...
}

以上是关于Nginx常用基础模块的主要内容,如果未能解决你的问题,请参考以下文章

Nginx基础入门之gzip常用配置项说明

Nginx基础入门之uptream负载均衡常用配置项说明

Nginx基础入门之fastcgi常用配置项说明

常用python日期日志获取内容循环的代码片段

nodejs常用代码片段

Nginx最常用的七种模块配置 #yyds干货盘点#