nginx访问限制

连接数监控

官网文档

http://nginx.org/en/docs/http/ngx_http_stub_status_module.html 模块介绍

该ngx_http_stub_status_module模块提供对基本状态信息的访问。

默认情况下不构建此模块,应使用 --with-http_stub_status_module 配置参数启用它。

 

Nginx状态信息(status)介绍 Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,对于想了解nginx的状态以及监控nginx非常有帮助。

让使用者了解Nginx的工作状态。

要想使用状态模块,在编译时必须增加--with-http_stub_status_module参数。

1.参数解释

Active connections
当前活动客户端连接数,包括Waiting连接数。

accepts
接受的客户端连接总数。

handled
处理的连接总数。
accepts 通常,除非已达到某些资源限制(例如, worker_connections限制) ,否则该参数值相同。

requests
客户端请求的总数。

Reading
nginx 正在读取请求标头的当前连接数。

Writing
nginx 将响应写回客户端的当前连接数。

Waiting
当前等待请求的空闲客户端连接数。

# 注意
一个tcp连接,可以发起多个http请求
可以通过修改保持连接参数修改
keepalive_timeout 0; 表示关闭长连接

 

2.看下你的nginx支持这个模块吗

nginx -V

 

3.配置文件

cat >/etc/nginx/conf.d/status.conf<<EOF
server{
    listen 9999;
    server_name localhost;
  stub_status on;
  access_log off;
}
EOF
重启

[root@web-9 /var/log/nginx]#systemctl restart nginx

 

4.访问状态

 

 

 

基于IP的访问限制

模块
http://nginx.org/en/docs/http/ngx_http_access_module.html

 

1.配置语法

句法:    allow address | CIDR | unix: | all;
默认:    —
语境:    http, server, location,limit_except
允许访问指定的网络或地址。如果指定了特殊值unix:(1.5.1),则允许访问所有 UNIX 域套接字。

句法:    deny address | CIDR | unix: | all;
默认:    —
语境:    http, server, location,limit_except
拒绝对指定网络或地址的访问。如果指定了特殊值unix:(1.5.1),则拒绝所有 UNIX 域套接字的访问。

 allow和deny是自上而下的加载顺序

2.拒绝windows访问www域名

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
        deny 10.0.0.1;
        allow all;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

 

但是虚拟机,走内网环境是可以通的。

 

3.只允许windows访问,其他人拒绝

注意allow和deny的加载顺序是,自上而下加载;

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
        allow 10.0.0.1;
        deny all;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

windows可访问

 

linux不可访问

 

第一题
限制只允许10.0.0.0~10.0.0.255范围的IP访问(禁止其他网段的访问)

创建虚拟主机,完成该功能
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
    allow 10.0.0.0/24;
    deny all;
    root  /www/deny-allow;
    index index.html;
}

}

创建测试数据,查看访问情况
[root@web-8 /etc/nginx/conf.d]#mkdir -p /www/deny-allow
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#echo 'I am web-8  , test  deny  and  allow !!!!!!!!'  > /www/deny-allow/index.html

[root@web-8 /etc/nginx/conf.d]#systemctl restart nginx
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 22334
tcp        0      0 0.0.0.0:22334           0.0.0.0:*               LISTEN      7402/nginx: master  



1. 用win去访问,可以吗?  可以的
http://10.0.0.8:22334/

2. 用61机器去访问,
# 网卡的流量,网段是对应起来的 
eth0   10.0.0.61
eth1    172.16.1.61
curl 10.0.0.8:22334        # 从61机器的10.0.0.61发出
curl 172.16.1.8:22334      # 从61机器的172.16.1.61发出



只写一个allow的话,等于没有任何意义,必须做好deny限制,才有实际意义。
- 限制只允许172.16.1.0 ~ 172.16.1.255 范围的IP访问,禁止其他任意的地址访问。
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        #allow 10.0.0.0/24;
        allow 172.16.1.0/24;
        deny  all;  # 拒绝客户端访问该网页根目录下的资源,返回403权限不足
    root  /www/deny-allow;
    index index.html;
}

}


你发现,处于同一个内网环境下的 ,有172网段的机器是通的,
比如win这回访问可以通码? 可以 1 不可以 2
- 限制只允许windows访问(禁止其他机器访问,比如任意的 10.0.0.61  任意的172.16.1.52)


[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        # allow 10.0.0.0/24;
        # allow 172.16.1.0/24;
        allow 10.0.0.1;
        deny  all;  # 拒绝客户端访问该网页根目录下的资源,返回403权限不足
    root  /www/deny-allow;
    index index.html;
}

}

# 看懂 3  不懂 4

# 待会试试,用不同网段的客户端ip,访问,查看权限
# 测试几个客户端
10.0.0.1 通 ,只有这一个ip地址是通的.

10.0.0.61  不通
172.16.1.52 不通
- 限制拒绝10.0.0.0~10.0.0.255范围的IP访问(得允许其他网段访问)
(这个ip限制规则,自上而下的匹配,匹配到规则后,就不会继续向后匹配了)


此时只能通过内网的172网卡去访问这个机器了
# 配置如下
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
    deny 10.0.0.0/24;
    root  /www/deny-allow;
    index index.html;
}

}


# 通过如下这几个客户端试试,先用10网段的试试
发现10网段全部被拒绝
发现172网段是允许被访问的

基于ip,判断出目标机器是windos吗?

通过目标机器的user-agent去判断,判断的浏览器客户端,是windows等情况,拒绝

限制只拒绝windows访问。其他人都允许访问
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        deny 10.0.0.1;
    root  /www/deny-allow;
    index index.html;
}

}



10.0.0.1 只有它不能访问

测试

window访问 172.16.1.8:22334 

能通 扣 1,不能扣 2



windows(vmnet8  10.0.0.1,)

172网段(vmware提供的LAN网段,纯局域网,)

 

 

 

基于用户认证的访问限制

有时候,我们一些站点内容想要进行授权查看,只能输入账号密码之后才能访问,例如一些重要的内网平台,CRM,CMDB,企业内部WIKI等等。

1.语法

https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

句法:    auth_basic string | off;
默认:    
auth_basic 关闭;
语境:    http, server, location,limit_except
启用使用“HTTP 基本身份验证”协议验证用户名和密码。
指定的参数用作realm. 参数值可以包含变量(1.3.101.2.7)。
特殊值off取消了auth_basic从先前配置级别继承的指令的效果。

句法:    auth_basic_user_file file;
默认:    —
语境:    http, server, location,limit_except

 

2.创建密码文件

htpasswd是Apache密码生成工具,Nginx支持auth_basic认证,因此我门可以将生成的密码用于Nginx中,输入一行命令即可安装:

yum -y install httpd-tools 

参数
-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.
-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互

#创建认证文件,htpasswd -bc .access username password 

#在当前目录生成.access文件,用户名username,密码:password,默认采用MD5加密方式。
具体操作

[root@web-9 ~]#htpasswd -b -c /etc/nginx/auth_passwd yuchao01 yuchao666
Adding password for user yuchao01

 

3.nginx调用密码文件

[root@web-9 ~]#cat /etc/nginx/conf.d/www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
        auth_basic "yuchaoit.cn welcomes you";
        auth_basic_user_file /etc/nginx/auth_passwd;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

4.访问测试

只有www.yuchaoit.cn站点被加了密码。

 

其他未设置认证的可以直接访问。

 

nginx请求限制

1.官网模块

https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

 

1.知道用法即可,生产下的限流,更多的是后端框架中限制,nginx这里一般不做,可能导致请求出错。知道用法,以后看到企业里在用,会维护即可。

2.以及理解限流的概念。

2.配置语法

 

限速规则语法
https://docshome.gitbook.io/nginx-docs/he-xin-gong-neng/http/ngx_http_limit_req_module


ngx_http_limit_req_module 模块(0.7.21)用于限制每个已定义 key 的请求处理速率,特别是来自单个 IP 地址请求的处理速率。限制机制采用了 leaky bucket (漏桶算法)方法完成。

 

3.参数示例

# 1.定义一个限速规则
# 定义限速区域,保持在10兆字节的区域one,该区域的平均处理请求每秒不能超过1个。
# $binary_remote_addr 变量的大小始终为 4 个字节,在64位机器上始终占用64字节
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;

参数解释
limit_req_zone        # 引用限速模块
binary_remote_addr    # 判定条件,远程的客户端IP
zone        # 定义限速区域名称,内存大小
rate        # 限速规则,1秒只能1个请求


# 2.引用限速规则
limit_req zone=two  burst=5;  
limit_req # 引用哪一个限速区域

burst=5 # 令牌桶、平均每秒不超过 1 个请求,并且突发不超过5个请求。
nodelay  # 如果不希望排队堆积的请求过多,可以用这个参数。

 

4.实际用法

限速规则是1秒一个请求
提供3个vip特殊名额
[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    limit_req zone=one burst=3 nodelay;
    location / {
        root   /usr/share/nginx/html/game;        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

5.访问测试

正常限速内

[root@master-61 ~]#for i in {1..10};do curl -I www.yuchaoit.cn;sleep 1;done

 

 

超速访问情况

[root@master-61 ~]#for i in {1..20};do curl -I www.yuchaoit.cn;sleep 0.5 ;done

 

 

nodelay参数作用

用法1,不加nodelay参数

这个nginx的意思是,该虚拟主机,限制客户端 1秒内只能有5个请求,其他请求全部延迟排队。这个参数有麻烦,别用,可能导致出现大问题。

[root@web-8 ~]#cat  /etc/nginx/conf.d/limit_req.conf 
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
​
server {
    listen       33555;
    server_name  _;
    charset utf-8;
    access_log /var/log/nginx/limit_req.log;
    limit_req zone=one burst=3 ;
    location / {
        root   /www/limit-req; 
        index  index.html index.htm;
    }
}
​

 

用法2,添加nodelay参数

请求不排队,限速是几个就几个,超过就直接503拒绝,以及设置了burst特殊请求。

 

posted @ 2023-06-13 13:38  Mrterrific  阅读(181)  评论(0编辑  收藏  举报