基于Nginx实现访问控制,连接限制,动静分离

目录

1、访问控制

1.1 访问控制概念

1.2 ngx_http_access_module模块

1.3 ngx_http_auth_basic_module模块

2、连接限制

2.1 为什么要对Nginx做连接限制?

2.2 ngx_http_limit_conn_module 模块

2.3 ngx_http_limit_req_module模块

2.4 连接限制白名单

3、动静分离


1、访问控制

1.1 访问控制概念

访问控制要做的事情是控制客户端的资源访问权限

主要有两种方法,一种是基于IP的访问控制,另一种是基于Basic Auth认证

Nginx各模块参考配置地址nginx documentation

基于IP的访问控制 ngx_http_access_module模块

基于用户的信任登录 ngx_http_auth_basic_module模块

1.2 ngx_http_access_module模块

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

1.2.1 配置语法

#allow访问 允许 address表示地址,CIDR表示网段。unix:指定了特殊值,则允许访问所有UNIX域套接字。all表示所有的
Syntax: allow address | CIDR | unix: | all;
Default: —
#可以配置的位置
Context: http, server, location, limit_except
​
#deny访问 拒绝 address表示地址,CIDR表示网段。unix:指定了特殊值,则拒绝访问所有UNIX域套接字。all表示所有的
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

1.2.2 配置测试

 location / {
    deny 192.168.223.129;   #拒绝192.168.223.129 访问
    allow all;              #允许所有
    root html;
 }

在被拒绝的129服务器上进行测试

在被允许的130服务器上进行测试

1.3 ngx_http_auth_basic_module模块

1.3.1 配置语法

# auth_basic 默认关闭,开启的话输入一段字符串即可。
Syntax: auth_basic string | off;
#默认关闭
Default: auth_basic off;
#可以配置的位置
Context: http, server, location, limit_except
​
# auth_basic_user_file 该文件存储用户账号密码。
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except

1.3.2 配置测试

htpasswd -c /etc/nginx/htpasswd laohu #laohu为新增的用户
#....按提示输入密码即可,如下:
[root@ydt1 nginx]# htpasswd -c /usr/local/nginx/auth_conf laohu
New password:
Re-type new password:
Adding password for user laohu
​
​
#修改nginx.conf配置
location / {
      auth_basic "Auth access test! input your password!"; #开启身份验证
      auth_basic_user_file /usr/local/nginx/auth_conf; #指定身份验证文件地址
      root html;
}
​

2、连接限制

2.1 为什么要对Nginx做连接限制?

我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制!

包括限制并发连接数和连接请求数

2.2 ngx_http_limit_conn_module 模块

2.2 .1 限制并发连接数

ngx_http_limit_conn_module 模块来实现。该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数。并不是所有的连接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数

2.2.2 连接限制配置语法:

# limit_conn_zone 定义限制连接的命名空间
# key 一般填写binary_remote_addr和remote_addr,代表的含义是一样的(远程主机的IP)只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节
# zone=name 命名空间 ,用来存储连接客户端ip
# size 空间大小,作为限制存储连接客户端信息的上限
Syntax: limit_conn_zone key zone=name:size;
# 默认无限制
Default: —
# 配置上下文 http
Context: http
​
# limit_conn 限制命令
# zone 就是上面定义的命名空间
# 限制并发次数
Syntax: limit_conn zone number;
# 默认无限制
Default: — 
# 配置上下文 http,server,location
Context: http, server, location

2.2.3 压力测试

配置:

http{
    #区域名称为addr,共享内存缓存大小为10m
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server{
        location / {
           #该区域并发数不能超过2个
            limit_conn addr 2;
        }
    }
}

安装压力测试插件Apache Jmeter,下载官网:Apache JMeter - Download Apache JMeter

解压后, 运行 “bin/jmeter.bat” ,如下图,你可以通过菜单“选项”切换为中英文!

1)、创建测试线程组:

压力测试小知识:

线程数:n 3
Ramp-Up Period:T (为线程运行准备的总时长)0.01
循环次数:a  1
若每个循环运行时间是 t 0.5
当时间到 S = (T- T/n)时,最后一个线程启动,若要使所有线程并行运作,则需要在最后一个线程启动的时候第一个线程仍未关闭,为达到这个要求,需满足 a-t > S及a > S/t

2)、模拟Http请求

3)、Http头信息配置

4)、创建查看结果树

2.3 ngx_http_limit_req_module模块

2.3.1 限制并发请求处理速率

模块用于限制对每个定义键的请求处理速率,例如,单客户端IP的每秒请求数。实现的原理是使用“漏桶”原理。

2.3.2 请求限制的配置

# limit_conn_zone 定义限制连接的命名空间
# key 一般填写binary_remote_addr和remote_addr,代表的含义是一样的(远程主机的IP)只是使用binary_remote_addr存储一个IP会比remote_addr省10个字节
# zone=name 命名空间 ,用来存储连接客户端ip
# size 空间大小,作为限制存储连接客户端信息的上限
# rate=rate 频率
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
​
# limit_conn 限制命令
# zone 就是上面定义的命名空间
# []为可选参数 burst=3 往后延迟3个请求(如果有40个请求,那么会失败40-(N*(总耗时ms/1000ms))-3个) nodelay 立即返回
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location

2.3.3 压力测试

http{
    #区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server{
        location / {
           #允许超过频率限制的请求数不多于3个。如果不希望超过的请求被延迟,可以用nodelay参数,失败的都会以503状态返回
            limit_req zone=one burst=3 nodelay;
        }
    }
}

测试过程参考ngx_http_limit_conn_module模块: 2.2.3 压力测试

2.4 连接限制白名单

可能要对某些信任的IP不做限制,需要使用到白名单-----这不是就是VIP客户嘛。

Nginx自带模块:ngx_http_geo_module,ngx-http-map-module

    geo $remote_addr $geo {
        default 0; #0表示禁止访问
        192.168.223.129 1; #1表示可以访问
    }
    server {
      listen 81;
      location / {
          # 如果不是白名单则 显示403 禁止访问
          if ( $geo  = 0 ) {
             return 403;
          }
          proxy_pass http://192.168.223.128:15672;
      }
    }
--------------------------------------------------------------------------------
    geo $whiteiplist {
        default 1; #1表示限制
        192.168.223.129 0; #0表示不受限制
    }
    map $whiteiplist $limit {
        1 $binary_remote_addr;
        0 "";
    }
​
    limit_conn_zone $limit zone=addr:10m;
    server {
      listen 81;
      location / {
          limit_conn addr 2;
          proxy_pass http://192.168.223.128:15672;
      }
    }
​
#1. geo指令定义一个白名单$whiteiplist, 默认值为1, 所有都受限制。 如果客户端IP与白名单列出的IP相匹配,则$whiteiplist值为0也就是不受限制。
#2. map指令是将$whiteiplist值为1的,也就是受限制的IP,映射为客户端IP。将$whiteiplist值为0的,也就是白名单IP,映射为空的字符串。
#3. limit_conn_zone和limit_req_zone指令对于键为空值的将会被忽略,从而实现对于列出来的IP不做限制。

3、动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

    upstream test {
        server 192.168.223.128:15672 weight=9; #内部服务器1
        server 192.168.223.129:15672 weight=1; #内部服务器2
    }
​
    server {
        listen       81;
        server_name  localhost;
​
        # 所有静态请求都由nginx处理,存放目录为html
        location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
            root html;
        }
​
        # 所有动态请求都转发给tomcat处理
        location / {
            proxy_pass  http://test;
        }
    }

这样我们就可以把静态资源/usr/local/html目录下,而tomcat负责处理其他请求,例如当我们后缀为gif的时候,Nginx默认会从/usr/local/html获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活

附:location 语法规则: location [=|~|~|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头 ~ 开头表示区分大小写的正则匹配 以xx结尾 ~ 开头表示不区分大小写的正则匹配 以xx结尾 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹配到。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值