nginx 请求限制和访问控制
请求限制
限制主要有两种类型:
- 连接频率限制: 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
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
listen 80;
server_name localhost; #charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main; location / {
root /opt/app/code;
#limit_conn conn_zone 1;
#limit_req zone=req_zone burst=3 nodelay;
#limit_req zone=req_zone burst=3;
#limit_req zone=req_zone;
index index.html index.htm;
}
我们看到上面为定义zone,第二行是请求定义,表示对远程请求进行每秒一次的请求限制。这里的binary_remote_addr和remote_addr代表的含义是一样的(远程主机的IP)只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节。burst 参数往后延迟3个请求 nodelay 立即返回
保存重新加载
使用 ab 进行压力测试
ab -n 40 -c 20 http://192.168.1.112/
可以看到40 个都连接成功
请求限制打开,1s同一个客户端只允许连接一次
再次进行测试
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表示所有的。
实例:配置访问控制
首先我们查看没有限制的时候进行的输出
编辑配置文件
location ~ ^/admin.html {
root /opt/app/code;
deny 192.168.1.6;
allow all;
index index.html index.htm;
}
其中 ~ 表示对请求路径URL模式匹配,表示跟目下以1.html开头的家目录设置在/opt/app/code。
然后检查配置重启
nginx -tc /etc/nginx/nginx.conf
systemctl reload nginx
重新访问我们的页面
现在配置只有本机可以访问
location ~ ^/admin.html {
root /opt/app/code;
allow 192.168.1.0/24;
deny all;
index index.html index.htm;
}
然后检查配置重启
nginx -tc /etc/nginx/nginx.conf
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记录过程:
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 该文件存储用户账号密码。
我们看一下官网的文件格式
# comment
name1:password1
name2:password2:comment
name3:password3
密码加密方式有多中这里我们使用htpasswd
can be generated using the “htpasswd” utility from the Apache HTTP Server distribution or the “openssl passwd” command
想要使用该方式,首先要装对应的包
yum -y install httpd-tools
接下来创建对应的use_file文件
htpasswd -c ./auth_conf zhangbiao
编辑配置文件
location ~ ^/admin.html {
root /opt/app/code;
auth_basic "Auth access test! input your password!";
auth_basic_user_file /etc/nginx/auth_conf;
index index.html index.htm;
}
进行语法检查
nginx -tc /etc/nginx/nginx.conf
systemctl reload nginx
现在我们再次访问页面的时候就需要输入用户名密码
输入刚才的账号密码就可以正常访问了。
局限性:
一: 用户信息依赖文件
二: 操作管理机械,效率低
解决方式:
一: nginx结合LUA实现高效验证
二: nginx配合LDAP打通,利用nginx-auth-ldap模块
nginx 请求限制和访问控制的更多相关文章
- Nginx 连接限制和访问控制Nginx 连接限制和访问控制
Nginx 连接限制和访问控制 前言 Nginx自带的模块支持对并发请求数进行限制, 还有对请求来源进行限制.可以用来防止DDOS攻击.阅读本文须知道nginx的配置文件结构和语法. 连接限制 l ...
- nginx 请求限制
1.nginx 请求限制 1.连接频率限制 - limit_conn_module 2.请求频率限制 - limit_req_module 连接限制的语法 请求限制的语法 limit_conn_zon ...
- Nginx请求限制配置
Nginx请求限制配置 请求限制可以通过两种方式来配置,分别是 连接频率限制和请求频率限制 首先我们要知道什么是http请求和连接,浏览器和服务端首先通过三次握手完成连接,然后发起请求,传输请求参数 ...
- Nginx防盗链、访问控制、解析PHP相关配置及Nginx代理
6月11日任务 12.13 Nginx防盗链12.14 Nginx访问控制12.15 Nginx解析php相关配置12.16 Nginx代理 扩展502问题汇总 http://ask.apelearn ...
- nginx 请求负载 转发规则设置
(1)轮询(默认) weight=5; #本机上的Squid开启3128端口,不是必须要squid server 192.168.8.2x:80 weight=1 ...
- nginx请求体读取(二)
2,丢弃请求体 一个模块想要主动的丢弃客户端发过的请求体,可以调用nginx核心提供的ngx_http_discard_request_body()接口,主动丢弃的原因可能有很多种,如模块的业务逻辑压 ...
- nginx请求体读取
上节说到nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外 ...
- Nginx 请求的11个阶段
48 1:当请求进入Nginx后先READ REQUEST HEADERS 读取头部 然后再分配由哪个指令操作 2:Identity 寻找匹配哪个Location 3:Apply Rate Limi ...
- Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理
Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...
随机推荐
- Spring cloud微服务安全实战-3-4 API安全机制之认证(1)
本节开始讲认证相关的东西.注意事项,出现问题的对应的解决方案. 先写用户注册的服务,注册一些用户信息进去.注册也是我们安全体系的一部分 注册 UserController里面的create方法 先修改 ...
- [错误处理]no matches found: connexion[swagger-ui] ?
问题原因: [ ] 中括号会影响shell脚本的执行 安装的时候在包名扩上双引号"" pip install "connexion[swagger-ui]" w ...
- 转 mysql 存储过程初探
https://www.cnblogs.com/qmfsun/p/4838032.htmlMySQL命令执行sql文件的两种方法 https://www.cnblogs.com/mark-chan/p ...
- Swift4.0复习结构体
1.基本语法: /** 定义了一个结构体 */ struct Structure { /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty = /// ...
- JS和vue文本框输入改变p标签的内容测试
文本框输入,p标签的内容自动变成文本框的内容,如下是三种方法的测试: 方法1:JS里的onchange,当文本框内容改变事件,该事件里写的方法是,获取p标签本身,然后获取文本框的值,赋值给变量,最后给 ...
- SpringBoot里自定义banner
国外有一个专门用来生成banner的网址:http://patorjk.com/software/taag ,打开这个网址,生成你想要的字儿. 生成时,我们可以选择自己喜欢的字体等信息. 完成后,选择 ...
- 【GStreamer开发】GStreamer播放教程07——自定义playbin2的sink
目标 通过手动选择音频和视频的sink,playbin2可以进一步定制.这允许使用playbin2的应用在解码后可以自行做最终的渲染和显示.本教程展示了: 如何替换playbin2选择的sink 如何 ...
- 窗口、消息查看分析利器Spy++
Spy++ —— 窗口.消息查看分析利器 Spy++ —— 窗口.消息查看分析利器 2016年07月15日 00:25:22 阅读数:23170 1,简介 Microsoft Spy++是一个非常 ...
- 剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位 ...
- stm32f103的HSI设置
HSI基本知识 HSI是8MRC震荡电路,精度1%. PLL的设置必须在其被激活前完成,输出必须被设置温48M或者72M LSE:通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭. ...