请求限制

限制主要有两种类型:

  • 连接频率限制: limit_conn_module
  • 请求频率限制: limit_req_module

HTTP协议的连接与请求

HTTP协议是基于TCP的,如果要完成一次HTTP请求的时候,首先进行TCP的三次握手。当建立连接的时候就可以进行请求和响应。

可以得到结论:
HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求(可以有多个)

对于 limit_conn_module模块

该ngix_http_limit_conn_module模块用于限制每个定义的密钥的连接数量,特别是来自单个IP地址的连接数量。

并非所有连接都被计算在内 只有在服务器处理请求并且已经读取了整个请求头时才计算连接。

对于连接限制的配置:

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

对于第一部分可以理解在内存中开辟一个区域对于指定的nginx变量(key,例如:binary_remote_addr)进行限制。name表示申请的空间的名字,size表示申请空间的大小。

对于第二部分zone就是第一部分设置的名字name,number表示进行并发的限制。例如设置为1,表示一个时间段只能有一个。

对于ngx_http_limit_req_module模块:

用于限制每一个定义的密钥的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。限制是使用“泄漏桶”方法完成的

对于请求限制的配置:

  • Syntax: limit_req_zone key zone=name:size rate=rate;
  • Default: —
  • Context: http
  • Syntax: limit_req zone=name [burst=number] [nodelay];
  • Default: —
  • Context: http, server, location

对于第一部分配置和连接配置相似,rate表示速率,以秒s为单位(rate=1r/s)
对于第二部分zone就是第一部分设置的名字name,[]内为可配置选项。

实例:
首先编写配置文件 default.conf

  1. limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
  2. limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
  3. server {
  4. listen 80;
  5. server_name localhost;
  6.  
  7. #charset koi8-r;
  8. #access_log /var/log/nginx/log/host.access.log main;
  9.  
  10. location / {
  11. root /opt/app/code;
  12. #limit_conn conn_zone 1;
  13. #limit_req zone=req_zone burst=3 nodelay;
  14. #limit_req zone=req_zone burst=3;
  15. #limit_req zone=req_zone;
  16. index index.html index.htm;
  17. }

  

我们看到上面为定义zone,第二行是请求定义,表示对远程请求进行每秒一次的请求限制。这里的binary_remote_addr和remote_addr代表的含义是一样的(远程主机的IP)只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节。burst 参数往后延迟3个请求 nodelay 立即返回

保存重新加载

使用 ab 进行压力测试

  1. ab -n 40 -c 20 http://192.168.1.112/

可以看到40 个都连接成功

请求限制打开,1s同一个客户端只允许连接一次

再次进行测试

  1. ab -n 40 -c 20 http://192.168.1.112/

可以发现只成功了一次

访问控制

nginx的访问控制主要分为两类:

  • 基于IP的访问控制 http_access_module
  • 基于用户的信任登录 http_auth_basic_module

对于http_access_module模块:

模块允许限制访问某些客户端地址。访问也可以通过密码子请求结果或JWT来限制满足控制地址和密码的同时访问限制。

配置语法:

  • 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

语法中address表示地址,CIDR表示网段。unix:指定了特殊值,则允许访问所有UNIX域套接字。all表示所有的。

实例:配置访问控制
首先我们查看没有限制的时候进行的输出

编辑配置文件

  1. location ~ ^/admin.html {
  2. root /opt/app/code;
  3. deny 192.168.1.6;
  4. allow all;
  5. index index.html index.htm;
  6. }

其中 ~ 表示对请求路径URL模式匹配,表示跟目下以1.html开头的家目录设置在/opt/app/code。

然后检查配置重启

  1. nginx -tc /etc/nginx/nginx.conf
  2. systemctl reload nginx

重新访问我们的页面  

现在配置只有本机可以访问

  1. location ~ ^/admin.html {
  2. root /opt/app/code;
  3. allow 192.168.1.0/24;
  4. deny all;
  5. index index.html index.htm;
  6. }

然后检查配置重启 

  1. nginx -tc /etc/nginx/nginx.conf
  2. systemctl reload nginx

  

重新访问我们的页面 

http_access_module模块的局限性:

nginx的访问控制限制是针对客户端的IP来进行限制的,但是nginx并不确定真正的客户端是哪个,凡是和nginx进行交互的都被当做是客户端。(remote_addr是直接和nginx通信的IP)如果我们访问不是直接访问到服务端而是由中间代理进行(如上图),访问控制这时就会失效。

局限性解决方法总结:

方法一: 采用http头信息控制访问,如HTTP_X_FORWARD_FOR
方法二: 结合geo模块
方法三: 通过HTTP自定义变量传递

http_x_forwarded_for头信息控制访问 会更好的解决该问题,它要求访问时必须带上所有用到的ip的地址信息
我们看一下http_x_forwarded_for记录过程:

  1. http_x_forwarded_for = Client IP, Proxy(1)IP, Proxy(2)IP,...

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

语法讲解:
auth_basic 默认关闭,开启的话输入一段字符串即可。
auth_basic_user_file 该文件存储用户账号密码。

我们看一下官网的文件格式

  1. # comment
  2. name1:password1
  3. name2:password2:comment
  4. name3:password3

详细官方链接

密码加密方式有多中这里我们使用htpasswd  

can be generated using the “htpasswd” utility from the Apache HTTP Server distribution or the “openssl passwd” command

想要使用该方式,首先要装对应的包 

  1. yum -y install httpd-tools

接下来创建对应的use_file文件  

  1. htpasswd -c ./auth_conf zhangbiao

编辑配置文件

  1. location ~ ^/admin.html {
  2. root /opt/app/code;
  3. auth_basic "Auth access test! input your password!";
  4. auth_basic_user_file /etc/nginx/auth_conf;
  5. index index.html index.htm;
  6. }

  

进行语法检查

  1. nginx -tc /etc/nginx/nginx.conf
  2. systemctl reload nginx

现在我们再次访问页面的时候就需要输入用户名密码  

输入刚才的账号密码就可以正常访问了。

局限性:

一: 用户信息依赖文件
二: 操作管理机械,效率低

解决方式:

一: nginx结合LUA实现高效验证
二: nginx配合LDAP打通,利用nginx-auth-ldap模块

nginx 请求限制和访问控制的更多相关文章

  1. Nginx 连接限制和访问控制Nginx 连接限制和访问控制

    Nginx 连接限制和访问控制   前言 Nginx自带的模块支持对并发请求数进行限制, 还有对请求来源进行限制.可以用来防止DDOS攻击.阅读本文须知道nginx的配置文件结构和语法. 连接限制 l ...

  2. nginx 请求限制

    1.nginx 请求限制 1.连接频率限制 - limit_conn_module 2.请求频率限制 - limit_req_module 连接限制的语法 请求限制的语法 limit_conn_zon ...

  3. Nginx请求限制配置

    Nginx请求限制配置 请求限制可以通过两种方式来配置,分别是  连接频率限制和请求频率限制 首先我们要知道什么是http请求和连接,浏览器和服务端首先通过三次握手完成连接,然后发起请求,传输请求参数 ...

  4. Nginx防盗链、访问控制、解析PHP相关配置及Nginx代理

    6月11日任务 12.13 Nginx防盗链12.14 Nginx访问控制12.15 Nginx解析php相关配置12.16 Nginx代理 扩展502问题汇总 http://ask.apelearn ...

  5. nginx 请求负载 转发规则设置

    (1)轮询(默认) weight=5;         #本机上的Squid开启3128端口,不是必须要squid         server 192.168.8.2x:80    weight=1 ...

  6. nginx请求体读取(二)

    2,丢弃请求体 一个模块想要主动的丢弃客户端发过的请求体,可以调用nginx核心提供的ngx_http_discard_request_body()接口,主动丢弃的原因可能有很多种,如模块的业务逻辑压 ...

  7. nginx请求体读取

    上节说到nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外 ...

  8. Nginx 请求的11个阶段

    48 1:当请求进入Nginx后先READ REQUEST HEADERS 读取头部 然后再分配由哪个指令操作 2:Identity 寻找匹配哪个Location  3:Apply Rate Limi ...

  9. Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理

    Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...

随机推荐

  1. netty5自定义私有协议实例

    一般业务需求都会自行定义私有协议来满足自己的业务场景,私有协议也可以解决粘包和拆包问题,比如客户端发送数据时携带数据包长度,服务端接收数据后解析消息体,获取数据包长度值,据此继续获取数据包内容.我们来 ...

  2. 【Mybatis】MyBatis之配置自定义数据源(十一)

    本例是在[Mybatis]MyBatis之配置多数据源(十)的基础上进行拓展,查看本例请先学习第十章 实现原理 1.扩展Spring的AbstractRoutingDataSource抽象类(该类充当 ...

  3. [整理]Python程序员面试前需要看的博客(持续整理)

    基本素养 如何聪明的提问 面试方法 从面试官角度来告诉大家,哪些人能面试成功 如何在面试中介绍自己的项目经验 计算机系统 [面试] 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清 ...

  4. Qt编写气体安全管理系统21-探测器管理

    一.前言 探测器在整个系统中是最核心的关键的硬件,终端节点硬件,安装有探测芯片装置,负责探测前端对应气体浓度,并记录值,等待控制器轮训数据回复,控制器信息表也是字段最多的,要存储位号.控制器名称.探测 ...

  5. python 判断文件是否存在和删除文件的api (其中判断文件在不在让想起这个可以强兼容jenkins工作目录那个问题)

    判断文件在不在的api: os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作. os.path模块主要用于文件的属性获取,exists是“存在” ...

  6. Swift细节记录<一>

    1.全局变量记录: import UIKit class HHTSwitchGlobalData: NSObject { var isWaiterAutoPop: Bool = true privat ...

  7. docker build时改变docker中的apt源

    # Ali apt-get source.list RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \ echo & ...

  8. Makefile中宏定义

    实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解 ...

  9. python防止sql注入的方法

    python防止sql注入的方法: 1. 使用cursor.execute(sql, args)的参数位: sql_str = "select * from py_msgcontrol.py ...

  10. [转帖]K8s 工程师必懂的 10 种 Ingress 控制器

    K8s 工程师必懂的 10 种 Ingress 控制器 https://www.kubernetes.org.cn/5948.html 控制器有好多啊. 2019-10-18 23:07 中文社区 分 ...