nginx访问限制——连接限制

本文详细介绍了Nginx的ngx_http_limit_conn_module模块,用于限制每定义密钥的连接数,包括从单一IP地址的连接数。文章涵盖了设置共享内存区域、日志记录级别、状态码以及具体配置实例,帮助读者理解并应用Nginx的连接限制功能。

官方文档:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
模板: ngx_http_limit_conn_module
简介模板该ngx_http_limit_conn_module模块用于限制每个已定义密钥的连接数,特别是来自单个IP地址的连接数。 并非所有连接都被计数。仅当连接具有服务器正在处理的请求并且已经读取了整个请求标头时,才对连接进行计数。(只有当服务器正在处理请求并且已经读取了整个请求标头时,才会计算连接)


一、设置共享内存区域和给定键值的最大允许连接数

句法:	limit_conn_zone key zone=name:size;
默认:	-
内容:	http

在HTTP / 2和SPDY中,每个并发请求都被视为一个单独的连接。

HTTP1.0TCP不能复用
HTTP1.1顺序性TCP复用
HTTP2.0多路复用TCP复用

二、为服务器限制连接数的情况设置所需的日志记录级别。

句法:	limit_conn_log_level info | notice | warn | error;
默认:	limit_conn_log_level error;
内容:	http,server,location

该指令出现在版本0.8.18中。

三、设置以响应被拒绝的请求返回的状态码。

句法:	limit_conn_status code;
默认:	limit_conn_status 503;
内容:	http,server,location

该指令出现在1.3.15版中。



四、配置文件
在这里插入图片描述

http {
	limit_conn_log_level error;          #连接的错误日志级别
    limit_conn_status 503;               #连接错误返回的状态码
    limit_conn_zone $binary_remote_addr zone=one:10m;    #设置共享内存区域和给定键值的最大并发连接数  “none”为存储区名($binary_remote_addr = 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话 #在HTTP/2和SPDY中,每个并发请求被视为单独的连接.
    limit_conn_zone $server_name  zone=perserver:10m;    #设置共享内存区域和给定键值的最大允许—— (服务器连接数)

    server {
        listen       80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location  /  {
                limit_conn one  1;      #最大并发连接数,每个客户端IP与服务器的连接也算一个连接数(每次只允许一个IP地址连接一次。)
                limit_conn perserver 1; #服务器总连接数不得超过个数,超过请求的会被拒绝(返回状态码503)
        }

重点思路哇(个人理解,如有错请指出来):

limit_conn_zone $binary_remote_addr zone=one:10m 定义限制客户端IP发起的请求数量(只要是个请求就算一个连接)

limit_conn_zone $server_name zone=perserver:10m 定义服务器自己允许的总的建立连接数量

现在明白了吗,双重限制哇,只要服务器限制的连接数量到了限制量就不接受任何连接。 接下来就是自己定义需求咯



官方提示limit_conn_zone :

在这里插入图片描述

二、测试
1)需要工具:ab
安装软件包: yum install httpd-tools -y

2)测试命令: ab -c 5 -n 100 http://ip.cip.cc/
注解:-c :并发量 -n:请求总数 ip.cip.cc: 外网IP地址

### 配置Nginx实现IP或用户访问限制 #### 1. 使用 `allow` 和 `deny` 实现基本的IP访问限制Nginx中,可以通过配置文件中的 `allow` 和 `deny` 指令来实现简单的IP白名单和黑名单功能。例如,如果只希望特定IP地址能够访问服务器资源,则可以在 `server` 或 `location` 块中定义如下规则: ```nginx location / { allow 192.168.1.100; deny all; } ``` 上述配置表示仅允许来自 `192.168.1.100` 的请求访问指定路径下的资源,其他所有IP均会被拒绝[^3]。 --- #### 2. 动态管理IP黑白名单——集成Redis 为了更灵活地管理和更新IP黑白名单,可以借助 Redis 存储动态数据并通过 Lua 脚本处理逻辑。以下是具体步骤: - **创建Redis集合** 在Redis数据库中创建一个名为 `nginx_ip_blacklist` 的Set集合,并向其中添加需要屏蔽的IP地址: ```bash redis-cli sadd nginx_ip_blacklist 192.168.1.101 192.168.1.102 ``` - **安装OpenResty/Nginx模块支持Lua** 如果尚未启用 OpenResty 或者 Nginx-Lua 模块,请先完成相关环境搭建。 - **编写Nginx配置并加载Redis连接库** 下面是一个完整的示例配置片段,展示如何利用Lua脚本查询Redis并将匹配的结果返回给客户端: ```nginx http { lua_shared_dict blacklist_cache 1m; init_by_lua_block { local redis = require "resty.redis" local red = redis:new() red:set_timeout(1000) function get_redis_blacklist(ip) local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.log(ngx.ERR, "failed to connect: ", err) return false end local res, err = red:sismember("nginx_ip_blacklist", ip) if err then ngx.log(ngx.ERR, "sismember error:", err) return false elseif tonumber(res) == 1 then return true else return false end end } server { listen 80; server_name localhost; location / { access_by_lua_block { local client_ip = ngx.var.remote_addr if get_redis_blacklist(client_ip) then ngx.exit(403) end } proxy_pass http://backend_server; } } } ``` 这段代码实现了当用户的IP存在于Redis存储的黑名单里立即终止其请求过程并向其发送HTTP状态码403响应[^2]。 --- #### 3. 控制域名级别的访问权限 除了基于IP的限制外,还可以通过检查 `$host` 变量的方式限定只有某些合法主机名才能正常工作。比如下面的例子展示了不允许任何非预期之外的站点名称发起调用的情况: ```nginx if ($host !~* ^(www\.)?example\.com$) { return 403; } ``` 这里采用正则表达式验证传入Host头字段是否符合预设模式;如果不满足条件就直接给出错误提示页面[^4]。 --- ### 总结 以上介绍了三种不同的方法用于设置Nginx上的访问约束机制:一是静态方式即单纯依靠本地conf设定好的固定规则集;二是引入外部缓存服务像Redis那样提供实可变的数据源从而增强灵活性;最后还提到了有关于网站身份认证方面的考量因素。每种方案都有各自适用场景以及优缺点所在,实际操作过程中需结合业务需求综合考虑选用哪一种最为合适。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值