Nginx实用插件

前言

本篇文章会从一些nginx上实用的插件进行介绍,以及应对后端服务出现故障处理、高并发限流、黑白名单插件、Nginx第三方插件的应用。这里包括爬虫限流、以及恶意请求,这些常见的场景下的处理。

代理服务故障处理

当请求过来,有一台服务器可能挂掉,然后nginx可能挂掉。以及 请求有一千五百万,但是所有服务器处理性能不够。以及出现故障时,主动健康检查支持不够,nginx;

 被动健康检查

ngx_http_upstream_module,可以做到基本的健康检查。
upstream指令块中的server子指令参数:max_fails、fail_timeout
upstream backend {
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s;
}
max_fails=2的意思是设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。失败的尝试次数默认是1。
设为0就会停止统计尝试次数,认为服务器是一直可用的。
fail_timeout=10s是设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。

 

主动健康检查

服务主动健康检查的Nginx插件,nginx_upstream_check_module
nginx 需要添加nginx_upstream_check_module 模块,用于对后端服务器的健康情况检测,如果后端服务器不可用,则把这台服务器移除负载均衡轮循集群,所有的请求不往这台服务器上转发,待这台服务器恢复正常后,再把这台加入到负载均衡集群。
upstream cluster {
# simple round-robin
server 127.0.0.1:8080;
server 127.0.0.1:8081;
check interval=5000 rise=1 fall=3 timeout=4000;
#check_http_send "HEAD / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}

Nginx实用插件 提取码:ejs7

上面有安装插件的方法。

故障转移

dubbo中会调几次,服务转移 熔断器等。 遇到故障定义下一个服务器上。

ngx_http_proxy_module模块对故障转移的支持
        

 一旦有这个超时配置过后,就会移到下一个服务器上。

proxy_next_upstream
在尚未向客户端发送任何内容的情况下才能将请求传递给下一个服务器。也就是说,如果在传输响
应的过程中发生错误或超时,则无法进行故障转移。一个请求传递给下一个服务时,还可以通过限
制重试次数、等待时间。
proxy_next_upstream_timeout
限制请求可以传递到下一个服务器的时间。默认为0,表示关闭限制。
proxy_next_upstream_tries
限制将请求传递到下一个服务器的可能尝试次数 。默认为0,表示关闭限制。

应对服务雪崩 

Nginx后面有2台上游服务,每台服务负载5000并发,假如第一台挂掉,Nginx将第一台的请求转发给第二台,将第二台打挂,整
个服务都不可用了。如果是多台服务,就这样多米诺骨牌效应产生,将全部服务打挂?怎么处理?
proxy_read_timeout
定义从代理服务器读取响应的超时。仅在两个连续的读操作之间设置超时,而不是为整个响应的传输。如果代理服务器在此时间内未传输任何内容,则关闭连接。默认60s。
max_conns参数
设置upstream中server指令的max_conns参数来进行控制每台服务器能够处理的最大的连接数
也就是失败连接不要马上去建立连接,导致服务雪崩

动态更新上游服务

后端服务发生变化,需要调整nginx的upstream列表,而且需要重启nginx,有一种插件可以无需重动nginx,动态更新后端服务地址列表。这个插件就是,ngx_http_dyups_module模块。
这个插件动态的更新后端列表
这个插件有个问题比较明显,因为数据存放在内存中,nginx 重启之后,配置内容就会清空。
Nginx可以通过Consul+Consul-template来解决(需要Nginx reload)
OpenResty可以通过balancer_by_lua+Consul来解决(无需Nginx reload)

高并发限流

本来网络请求有很大的不确定因素,有可能突然请求达到了几百万的同时请求。

像这些,我们不能拿到应用程序中去限制。tomcat压力就非常大了。

限制请求

模块ngx_http_limit_req_module (nginx.org)

Nginx中可以通过请求限制模块的指令来控制客户端的请求速率。使用“漏桶”算法,限制指定Key的请求处理速率,特别是从一个单一的IP地址的请求的处理速率。
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_req_zone $server_name zone=preserver:10m rate=10r/s;
    server {
        location /search/ {
        limit_req zone=one burst=5;
        limit_req zone=perserver burst=10;
     } 
   } 

}
示例,通过定义内存空间块:
限制单个IP平均每秒允许不超过1个请求,突发不超过5个请求
整个虚拟服务,平均每秒不允许超过10个,突发不超过10个请求
这个在反爬虫时, 限流,也比较有用的。 一旦限流过后会到其他页面上去。

 

 burst 表示突发请求。

zone 每秒请求。

 限制连接

Nginx中通过ngx_http_limit_conn_module模块,来限制连接到nginx服务的数量。用于限制每个定义密钥的连接数,特别是来自单个IP地址的连接数。并非所有连接都被计算在内 只有当服务器正在处理请求并且已经读取了整个请求标头时,才会计算连接。
http {
        limit_conn_zone $binary_remote_addr zone=addr:10m;
        limit_conn_zone $server_name zone = perserver:10m;
        server {
            location /download/ {
            limit_conn addr 1;
            limit_conn perserver 100;
}
 }
 }
示例,通过定义内存空间块: 限制单个IP建立不超过1个连接 整个虚拟服务,不允许超过10个连接

 限制给客户端的响应速率

http核心模块中对响应速率限制提供了支持,视频网站,不可能将所有带宽都给一个请求,我们需要限制每个请求的速率

http {
    server {
        location /download/ {
        limit_rate_after 500k;
        limit_rate 50k; 
} } }
示例,限制响应初始速率50k,后续响应速率限制在500k

针对爬虫限速

网络爬虫对网站的作用
一方面可以给网站带来一定的流量,便于搜索引擎收录,利于用户搜素。
另一方面会给服务器带来一定的压力,在网络爬虫对网站内容进行收录时,会引起服务器负载高涨。
有没有什么方法既不阻止网络爬虫对网站内容进行收录,同时对其连接数和请求数进行一定的限制呢?
robots.txt 协议
robots.txt文件内容称为爬虫协议,搜索引擎会根据这个文件的内容,来确定它访问权限的范围。它不是命令要求,需要
搜索引擎自觉遵守。
robots.txt 必须放置在一个站点的根目录下,而且文件名必须全部小写,一词不差。
robots.txt 写法:
User-agent: * 这里的*代表的所有的搜索引擎种类,*是一个通配符
Allow: /cgi-bin/ 这里定义是允许爬寻cgi-bin目录下面的目录
Disallow: /admin/ 这里定义是禁止爬寻 admin 目录下面的内容
Disallow: /require/ 这里定义是禁止爬寻 require 目录下面的内容

这些都是限制爬虫,限制其访问敏感数据。

Disallow: /data/www/images

 针对爬虫限速-Nginx配置

Map是nginx模块中用来映射变量的 根据每次请求 $http_user_agent 的内容进行子指令进行匹配,如果匹配成功,则将子指令右侧的 值赋值给$agent变量。匹配不到则给默认值。示例中表示,根据客户端的操作系统浏览器工具等信息,匹配是否为curl、apachebench、spider、bot、slurp也就是爬虫程序相关的名称,这里采 用了原有内容作为$agent的值。 
Limit_conn_zone、limit_req_zone则采用$agent 做为key来存储限制速率。

 所以我们在爬虫时,需要创建一个ip线程池,才能批量设置,并且对于单ip 一定要 对curl、apachebench、spider、bot、slurp 这些关键字做匹配

限制客户端上传速率

ngx_limit_upload_module是一个tengine模块,可以限制客户端发送请求主体时的上传速率。与标准的nginx limit_rate功能用法相同
速率限制请求主体从客户端的传输。速率以每秒字节数指定。
值0禁用速率限制。根据请求设置限制,因此如果客户端同时
打开两个连接,则总速率将是指定限制的两倍
Syntax: limit_upload_rate rate;
Default: limit_upload_rate 0;
Context: http, server, location, if in location
设置初始金额,在此之后,来自客户端的请求正文的进一步
传输将受到速率限制。
Syntax: limit_upload_rate_after size;
Default: limit_upload_rate_after 0;
Context: http, server, location, if in location

 Nginx实用插件 提取码:ejs7

可以进行检测

黑白名单插件

用来限制访问模块请求的。

Nginx的访问模块

ngx_http_access_module模块,提供允许、拒绝指令来控制客户端能否访问服务。
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
allow,允许某个ip或者一个 ip 段访问
deny,禁止某个ip或者一个 ip 段访问
针对ipi地址进行限制

 黑白名单插件

该插件很久没有维护了,而且不能正常使用,可以忽略该插件。

ngx_white_black_list 通过配置文件来指定黑白名单内容。

功能描述: 处在黑名单中的 ip 与网络,将无法访问 web 服务。 处在白名单中的 ip,访问 web 服务时,将不受 nginx 所有安全模块的限制。 支持动态黑名单(需要与 ngx_http_limit_req 配合),需要修改nginx代码这里就不提及了。如有需要,参考给到的ngx_white_black_list链接

nginx配置文件内容

# 简单指令以;结尾
worker_processes  4;
worker_rlimit_nofile 65535;
# 大括号属于块指令
events {
    worker_connections  1024;
}

http {
	# 定义 黑名单或白名单文件 空间key
	# 只能在http指令块中
	# white_black_list_conf可以配置多个 只需 zone=value 其中的value不同就可
	white_black_list_conf conf/white.list zone=white:2m;
	white_black_list_conf conf/black.list zone=black:4m;

	# 启用黑白名单,on/off,启用/关闭。
	# 在http、server、location下使用, 功能默认是关闭
	# 配置在对应的指令块中,对应的指令块上下文生效
	white_list white on; #白名单  white 在整个http{}中都开启
	black_list black on; #黑名单  black 在整个http{}中都开启

	server {
		listen 80;
		root /data/www/;

		# 黑白名单配置调整接口,通过它可以调整配置内容
		location /sec_config {
			sec_config on;
		}
	}
}

 主要还是根据官方文档,进行查找插件。

第三方插件

 这在官方网站上有大量的操作插件。

Guess you like

Origin blog.csdn.net/qq_33373609/article/details/121108724