企业场景ngx_http_limit_req_module模块/请求限制、并发限制、限速模块/ngx_http_auth_basic_module

ngx_http_auth_basic_module模块允许适应HTTP基本身份的验证,验证用户名和密码对资源的限制访问

  • 使用htpaswd创建新的密码文件, -c创建新文件 -b允许命令行输入密码
  • 参数语法
#使用HTTP基本身份验证协议启用用户名和密码验证
Syntax auth_basic  string| off;
Default auth_basic off;
Content:http,server,location,limit_except
#指定保存用户名和密码的文件
Syntax:auth_basic_user_file file;
Default: - 
Context:http,server,location,limit_exce

指定保存用户名和密码的文件,格式:

#可以使用httpasswd程序或openssl passwd 命令生成对应的密码;
name1:passwd1
name2:passwd2

#使用htpaaswd创建的密码文件,-c创建文件,-b允许命令行输入密码
[root@wulin ~]# yum install httpd-tools -y
[root@web01 conf.d]# rpm -ql httpd-tools
/usr/bin/ab   #压测工具
/usr/bin/htpasswd  #生成密码工具
[root@wulin ~]# htpasswd -b -c /etc/nginx/auth_pass wulin 123
[root@web01 conf.d]# cat /etc/nginx/auth_pass
wulin:$apr1$Cpuo1Dul$pE1Fh8KKf8OiP9SDCF0Xj.

#安全:缩小权限
ll /etc/nginx/auth_pass 查看
chmod 600 /etc/nginx/auth_pass 执行
chown www.www /etc/nginx/auth_pass

配置文件

[root@web01 conf.d]# cat mirrors.wulin.org.conf
server {
    listen 80;
    server_name mirrors.wulin.org;
    charset utf-8;
    root /data;   #正常站点目录

    location / {
        index index.html; #阿里云镜像首页
    }
    #yum仓库目录
    location /centos/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
     location /admin/ {           #网站后台,先进行办公源地址访问。
        #用户名密码验证
        auth_basic "wulin Auth access";
        auth_basic_user_file /etc/nginx/auth_pass;
    }
}

!nginx 检查语法
打开浏览器进行网站访问
!nginx 检查语法

企业案例

1.网站后台(结合LDAP统一认证,活动目录域控制):

邮箱、服务器、SVN、GIT、openvpn、PC密码、wiki、wify。

入职后HR开邮箱,一套用户、密码走遍公司。用户角色和权限是分离的,权限归宿各部门负责。

(后期编写ldap架构文章)

ngx_http_auth_basic_module局限性**

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

解决方式:

  1. nginx结合LUA实现高效验证
  2. nginx配合LDAP打通,利用nginx-auth-ldap模块

Nginx请求限制、并发限制、限速模块

1.Nginx请求数、并发连接及下载速度限制主要有三个模块:

  • 请求数频率限制:
    限制某个客户端在单位时间内同时访问的Http请求数,
    由ngx_http_limit_req_module实现。

  • 并发连接频率限制:
    限制同一时间的并发数,使用ngx_http_limit_conn_module实现。

  • 下载限速:
    限制客户端下载资源的速度,使用ngx_http_core_module实现

ngx_http_limit_req_module模块: #limit_req 限制请求

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

什么是限速?

限速分为两类:
1)限制某个客户端在单位时间内同时访问的Http请求数,
2)限制客户端的下载速度

2.限速方式方法
请求数限制:limit_req
限制某个客户端在单位时间内同时访问的Http请求数,由ngx_http_limit_req_module实现。

连接限制:limit_conn
限制同一时间的并发数,使用ngx_http_limit_conn_module实现。

下载限速:
限制客户端下载资源的速度,使用ngx_http_core_module实现

3.限速的原理
网络传输中常用两个的流量控制算法:漏桶算法令牌桶算法。这里的限制是使用“泄漏桶”方法实现的

漏桶算法(leaky bucket)

漏桶算法(leaky bucket)算法:
在这里插入图片描述

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶(缓冲队列),慢慢以固定速率流出;
  • 水桶满后水溢出(请求丢弃)

算法核心:缓存请求,匀速处理,多去请求直接丢弃

1)请求限制(limit_req)
limit_req_zone KaTeX parse error: Expected 'EOF', got '#' at position 50: …m rate=1r/s; #̲ 定义限制的关键字[binary_remote_addr],用户来源的IP地址
# 定义内存区域,名称为one,大小10m
# 定义速率每秒处理1个请求。

实测配置:

http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求

参数:

Syntax: limit_req_zone key zone=name:size rate=rate;
#与连接配置相似.rate表示速率,以秒s为单位(rate=1r/s)
Default:-
Context:http

Syntax:limit_conn zone number [burst=number] [nodelay];
这里zone是第一部分的名字name;[]内为不可配置选项
Default:-
Context:http,server.location

基于来源IP对下载速率限制,限制每一秒处理1次请求,突发超过5个请求放入缓存区

#http 标签定义请求限制,rate限制速率,限制一秒钟最多一个IP请求
http {
       limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s
}
server {
       listen 80;
       server_name mirrors.wulin.org;
       #请求超过1r/s,剩下的将被延迟处理,请求超过burst定义的数量,则返回503
       limit_req zone=req_one burst=5 nodelay;
       location / {
            root /data;
              index index.html;
       }
}
burst与nodelay
#通过设置burst参数,可以允许nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,这起到了平滑流量的作用,但是如果队列设置的比较大,请求排队的时间就会比较长,这对用户很不友好

#有处理办法呢?
nodelay参数运行请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理,这意味着burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的闵值;nodelay参数要跟burst参数要跟burst一起使用才有作用

限制客户端同一时刻并发连接数

参数:

#在内存中开辟一个区域对于指定的nginx变量(key,例如:binary_remote-addr)进行限制,name表中申请空间名字,size表示空间大小
Syntax: limit_conn_zone key=name:size;
Default:-
Context:http

Syntax:limit_coon zone number;#这里的zone就是第一部分设置的名字name,number


[root@web01 conf.d]# cat mirrors.wulin.org.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; #这个放此处即可
server {
listen 80;
server_name mirrors.wulin.org;
charset utf-8;
root /data; #正常站点目录

location / {
    index index.html; #阿里云镜像首页
}

#yum仓库目录
location /centos/ {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    limit_req zone=req_one burst=5 nodelay;
   # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
}
 location /admin/ {           #网站后台,先进行办公源地址访问。
    auth_basic "wulin Auth access";
    auth_basic_user_file /etc/nginx/auth_pass;
}

}
#burst与nodelay
#通过设置burst参数,可以允许Nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,这起到了平滑流量的作用。但是如果队列设置的比较大,请求排队的时间就会比较长,这对用户很不友好。
#有什么解决办法呢?nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理,请注意,这意味着burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的阈值。nodelay参数要跟burst一起使用才有作用。

在后端代码中添加后端功能并管理路由、权限、静态文件和速率限制,通常涉及使用一种服务器端框架如Node.js的Express、Python的Flask或Django,以及Nginx作为反向代理服务器。以下是具体的步骤: 1. **设置路径及访问**: - 使用上述框架创建一个新的API控制器或路由模块,例如在Express中: ```javascript const express = require('express'); const router = express.Router(); router.get('/api/data', (req, res) => { // 这里处理数据获取逻辑 res.json({ message: 'Data available here' }); }); app.use('/api', router); ``` - Nginx配置中将这个路径映射到对应的端口和应用: ```nginx location /api { proxy_pass http://localhost:3000; # 你的应用服务器地址 } ``` 2. **权限控制(Auth)**: - 使用JWT(JSON Web Tokens)或其他认证库,如Passport.js,在前端登录成功后返回token,然后在后端验证此token: ```javascript app.use((req, res, next) => { if (!req.headers.authorization) return res.status(401).send('Unauthorized'); // 验证token... next(); }); ``` 3. **静态文件访问**: - 对于静态资源,可以指定Nginx将特定路径下的文件直接交给浏览器处理: ```nginx location ~ ^/(img|css|js)/(.*)$ { alias /path/to/static/files/$1; autoindex off; } ``` 4. **连接速度限制**: - 可以使用`ngx_http_limit_req_module`插件或类似工具实现,例如限制单个IP每秒的请求次数: ```nginx location /slow { limit_req zone=slowburst burst=5 rate=20r/s; # 每秒最多20次请求 } ``` 记得替换相应的路径、端口号和配置细节以适应你的实际项目环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值