(1)nginx的请求限制可以通过以下来进行配置:

nginx tcp模块开发 nginx tcp和http_nginx

这俩个模块都可以实现nginx的请求限制,但是它们的实现原理是不一样的。区别就是在连接与请求上。

(2)那么对于Http协议的连接与请求:

nginx tcp模块开发 nginx tcp和http_nginx_02

Http的连接请求是建立在TCP连接的基础之上的。首先需要有Tcp的三次握手,然后才能有Http的连接请求。然后用客户端和服务器端不断的发送FIn和Ack来保持连接,也就是keepAlive.连接是建立在Http请求的基础之上的。在现在这个时代,其实一次连接可以处理多个的http请求。

(3)各个Http版本的区别:

nginx tcp模块开发 nginx tcp和http_nginx tcp模块开发_03

在Http1.0中,TCP是不可以复用的,也就是在客户端在发送了HTTP请求以后,服务器端在返回响应的一定时间内是会断开的。一次连接就对应着一次的请求。在Http1.1版本中,一次连接可以顺序性的对应着对应Http请求。在Http2.0版本中,一次连接可以并行的对应着多次的Http请求。

那么总结来说就是这样:

Http请求建立在一次TCP连接的基础上。一次的TCPa连接至少产生一次的Http请求。也可以产生多次的Http请求。

(4)对于连接限制-limit_conn_zone:

nginx tcp模块开发 nginx tcp和http_服务器端_04


这个模块的目的主要是对连接进行限制,如果是这样的话,那么我们就需要对连接的状态进行进行存储。那么是用什么来进行存储呢?存储肯定是需要空间的。这个limit_conn_zone就是开辟了这样的一个空间。这个空间里,我们需要对那个作为key要进行说明,比如说,以客户端ip作为Key。那么这样的话,就以http_addr这个变量作为Key。如果要以别的内置变量作为key来作为key来进行配置的时候,那么同样,可以写到key配置的这一项中。那么后面的znotallow=name:size,就是限制的空间,name指的是空间的名字,size表示的是空间的大小。在真正实现限制的时候就会调用这个空间。在limit_conn zone number中就可以调用这个空间。在limit_conn zone number中,是要结合先定义好的zone 才能使用limit_conn.这个zone指的是我们需要调用的zone的name.number指的是并发的限制个数。

(5)对于请求限制-limit_req_zone:

nginx tcp模块开发 nginx tcp和http_TCP_05


Rate:表示限制请求的速率是多大,一般来说,是以秒为单位的。

(6)具体的配置:

nginx tcp模块开发 nginx tcp和http_nginx tcp模块开发_06


在这里有一个limit_req znotallow=req_zone;这个req_zone对应的就是开头定义好的zone.Znotallow=req_zone:1m rate=1r/s;这个表示的是对于同一个客户端过来的,我限制它是1秒1个。$remote_addr和binary_remote_addr,其实处理的都是一个意思。在这里,这个zone的大小设置为了1m的大小。对于1m的空间,存储binary肯定比直接存储remote_addr要小。所以,使用了binary.