Nginx 请求限制

184 阅读2分钟
参数作用
limit_conn_module连接频率限制
limit_req_module请求频率限制

Http请求是建立在一次TCP连接基础上
一次TCP请求至少产生一次HTTP请求

  • 连接限制

例子:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }

语法:

Syntax:	limit_conn_zone key zone=name:size;
Default:Context:	http
Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location

限制客户端的链接,需要根据一个key标记客户端,然后需要记录客户端的状态,记录状态就需要在内存中申请空间。

limit_conn_zone : 是一个共享的存储客户端连接状态的容器,针对客户端连接的指定规则的key。示例中就是申请了命名为 addr,以客户端ip(内置变量$binary_remote_addr)为key,空间大小为10m,命名为addr的连接状态存储的容器。按照32bytes/session, 可以处理320000个session。 如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn: 示例中使用addr的连接状态容器,限制每个IP只能发起一个并发连接。如果超过最大并发连接,则返回503错误。

  • 请求限制

nginx.org/en/docs/htt… nginx.org/en/docs/htt…

例子:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

语法:

Syntax:	limit_req zone=name [burst=number] [nodelay | delay=number];
Default:	—
Context:	http, server, location

例子中定义了一个以客户端为标记,空间大小为10M,每秒限制链接速率为1,突发缓冲池大小为5的Nginx请求限制。一秒钟限制每个客户端请求一次,多余的5个放入缓冲区,在多余的作为503错误返回。

  • 访问控制

access_module

nginx.org/en/docs/htt…

例子:

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

语法:

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, deny : 是允许,阻止后面的配置进行访问。规则校验从上往下校验,直到找到第一个符合规则的配置才停止。
address: 可以配置单个ipv4,ipv6或者ipv4段,ipv6段
unix: 配置这个指定的字段,是允许或组织访问unix的socket
all: 代表所有

http_access_module的局限性:

1,$remote_addr

表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP

2,$http_x_forwarded_for

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP, 但是有风险,不能保证这个代理服务器不会篡改这个ip。 格式一般为:

X-Forwarded-For: Client IP, Proxy(1) IP, Proxy(2) IP, ...

解决方法

1,采用别的HTTP头信息控制访问,如: HTTP_X_FORWARDED_FOR
2,结合geo模块
3,通过自定义的HTTP变量传递

  • 访问认证模块

auth_basic_module

nginx.org/en/docs/htt…

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

auth_basic_user_file: 是配置指定一个用户密码的文件