Nginx 教程

Nginx 教程 Nginx 简介 Nginx 源码架构分析 Nginx 编译安装 Nginx(Tengine) 编译安装 Nginx(OpenResty) 编译安装 Nginx 配置简述 Nginx Docker 容器化配置

Nginx 核心配置指令

Nginx 核心配置指令 Nginx 配置文件 Nginx 进程配置指令 Nginx 端口监听:listen Nginx 主机名server_name Nginx 处理HTTP请求 Nginx 路由匹配规则:localhost Nginx 重定向配置:rewrite Nginx 根目录配置:root Nginx 访问路径别名:alias Nginx 文件判断:try_files Nginx 零复制:sendfile Nginx 日志记录配置

Nginx HTTP模块

Nginx 镜像模块 Nginx 请求头控制模块 Nginx IP访问控制模块 Nginx 用户cookie模块 Nginx 并发连接数限制模块 Nginx 首页处理模块 Nginx 请求频率限制模块 Nginx 页面缓存时间配置 Nginx gzip压缩及相关配置

Nginx Web服务

Nginx 静态资源服务器搭建 Nginx 文件下载服务器搭建 Nginx 伪动态SSI服务器 Nginx HTTPS服务器搭建 Nginx FastCGI模块配置简述 Nginx PHP服务器环境搭建 Nginx 基于FastCGI负载均衡 Nginx CGI网关接口 Nginx uWSGI模块配置 Nginx Python项目部署 Nginx 伪流媒体服务器搭建 Nginx HTTP2模块配置简述 Nginx WebDAV模块配置简述

Nginx 代理服务器

Nginx HTTP代理服务器 Nginx stream模块简述 Nginx TCP/UDP代理简述 Nginx 基于SSL的TCP代理服务器 Nginx gRPC代理服务器

Nginx 缓存

Nginx Web缓存配置 Nginx 代理缓存配置 Nginx Memcached 缓存模块 Nginx 反向代理缓存服务器配置 Nginx 客户端缓存控制

Nginx 负载均衡

Nginx 负载均衡模块 Nginx 负载均衡策略 Nginx 长连接负载均衡 Nginx upstream容错机制 Nginx upstream动态更新 Nginx TCP/UDP负载均衡

Nginx 日志管理监控

Nginx 日志分析简述 Nginx 访问日志配置 Nginx 错误日志配置 Nginx 日志归档配置 Nginx 日志分析工具 ELK Nginx 监控工具 Prometheus

Nginx 集群

LVS(Linux虚拟服务器)简介 Keepalived 配置简述 Nginx 集群负载搭建 Nginx 集群配置管理规划 Nginx 配置归档工具GitLab Nginx 配置修改工具Ansible Jenkins 安装与配置简述 Nginx 集群配置管理实例

Nginx 在 k8s 的应用

Kubernetes(k8s)系统简述 Kubernetes(k8s)集群部署 Kubernetes(k8s)网络通信 Nginx Ingress 简介 Nginx Ingress 安装部署 Nginx Ingress 配置映射 Nginx Ingress 注解


Nginx 请求频率限制模块

Nginx 的请求频率限制模块(ngx_http_limit_req_module)会对指定变量的请求次数进行计数,当该变量在单位时间内的请求次数超过设定的数值时,后续请求会被延时处理,当被延时处理的请求数超过指定的队列数时,将返回指定的状态码(默认状态码为 503)。

通常该模块被用于限定同一 IP 客户端单位时间内请求的次数。该模块通过共享内存存储计数状态以实现多个工作进程间的同一变量计数状态的共享。该模块的内置配置指令如下面表格中所示。

表:计数存储区指令

名称 计数存储区指令
指令 limit_req_zone
作用域 http
默认值 --
指令说明 设定用于存储指定变量请求计数的共享内存区域

表:请求限制设置指令

名称 请求限制设置指令
指令 limit_req
作用域 http, server, location
默认值 --
指令说明 启用请求限制并进行请求限制的相关配置

表:请求限制日志级别指令

名称 请求限制日志级别指令
指令 limit_req_log_level
作用域 http, server, location
默认值 error
指令值可选项 info, notice, warn, error
指令说明 当指定变量的并发连接数达到最大值时,输出日志的级别

表:请求限制状态指令

名称 请求限制状态指令
指令 limit_req_status
作用域 http, server, location
默认值 503
指令说明 当指定变量的并发连接数达到最大值时,请求返回的状态码

配置样例如下:

http {
    limit_req_zone $server_name zone=addr:10m rate=1r/s;
                # 限制访问当前站点的请求数,对站点请求计数,将计数内存区命名为addr,
                # 设置计数内存区大小为10MB,请求限制为1秒1次
    server {
        location /search/ {
            limit_req zone=one;       
                # 同一秒只接收一个请求,其余的立即返回状态码503,直到第2秒才接收新的请求
            limit_req zone=one burst=5;
                # 同一秒接收6个请求,其余的返回状态码503,只处理一个请求,其余5个请求进入队
          # 列,每秒向Nginx释放一个请求进行处理,同时允许接收一个新的请求进入队列
            limit_req zone=one burst=5 nodelay; 
                # 同一秒接收6个请求,其余的返回状态码503,同时处理6个请求,6秒后再接收新的请求
        }
    }
}

limit_req_zone 的 rate 参数的作用是对请求频率进行限制,有 r/s(每秒的请求次数)和 r/m(每分钟的请求次数)两个频率单位,也可根据每秒的次数换算成毫秒单位的次数。1MB 内存大小大约可以存储 16000 个 IP 地址的状态信息。

limit_req 的 burst 参数相当于一个缓冲容器,该容器内可容纳 burst 所设置的数量的请求,没有 nodelay 参数时,将匀速向 Nginx 释放需要处理的请求。未进入 burst 容器队列的请求将被返回状态码 503 或由 limit_req_status 指令指定的状态码。

limit_req 的 nodelay 参数是指对请求队列中的请求不进行延时等待,而是立即处理。

请求频率同样支持多个变量的同时计数及叠加,配置样例如下:

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;  

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}