Nginx如何限制http资源请求
前置条件:nginx 需要有 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,可以使用命令 2>&1 nginx -v | tr ' ' '\n'|grep limit 检查有没有相应模块,如果没有请重新编译安装这两个模块。
测试版本为:nginx版本为1.15+
限制链接数
1.使用 limit_conn_zone 指令定义密钥并设置共享内存区域的参数(工作进程将使用此区域来共享密钥值的计数器)。第一个参数指定作为键计算的表达式。第二个参数 zone 指定区域的名称及其大小:
limit_conn_zone $binary_remote_addr zone=addr:10m;
2.在 location {} , server {} 或者 http {} 上下文中使用 limit_conn 指令来应用限制,第一个参数为上面设定的共享内存区域名称,第二个参数为每个key被允许的链接数:
location /download/ { limit_conn addr 1; }
使用 $binary_remote_addr 变量作为参数的时候,是基于 ip 地址的限制,同样可以使用 $server_name 变量进行给定服务器连接数的限制:
http { limit_conn_zone $server_name zone=servers:10m; server { limit_conn servers 1000; } }
限制请求速率
速率限制可用于防止 ddos,cc 攻击,或防止上游服务器同时被太多请求淹没。该方法基于 leaky bucket 漏桶算法,请求以各种速率到达桶并以固定速率离开桶。在使用速率限制之前,您需要配置 "漏桶" 的全局参数:
key - 用于区分一个客户端与另一个客户端的参数,通常是变量
shared memory zone - 保留这些密钥状态的区域的名称和大小(即 "漏桶")
rate - 每秒请求数(r/s)或每分钟请求数(r/m)("漏桶排空")中指定的请求速率限制。每分钟请求数用于指定小于每秒一个请求的速率。
这些参数使用 limit_req_zone 指令设置。该指令在 http {} 级别上定义 - 这种方法允许应用不同的区域并请求溢出参数到不同的上下文:
http { #... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; }
使用此配置,将创建大小为 10m 字节,名称为 one 的共享内存区域。该区域保存使用 $binary_remote_addr 变量设置的客户端 ip 地址的状态。请注意, $remote_addr 还包含客户端的 ip 地址,而 $binary_remote_addr 保留更短的 ip 地址的二进制表示。
可以使用以下数据计算共享内存区域的最佳大小: $binary_remote_addr ipv4 地址的值大小为 4 个字节,64 位平台上的存储状态占用 128 个字节。因此,大约 16000 个 ip 地址的状态信息占用该区域的 1m 字节。
如果在 nginx 需要添加新条目时存储空间耗尽,则会删除最旧的条目。如果释放的空间仍然不足以容纳新记录,nginx 将返回 503 service unavailable 状态代码,状态码可以使用 limit_req_status 指令重新定义。
一旦该区域被设置,你可以使用 nginx 配置中的任何地方使用 limit_req 指令限制请求速率,尤其是 server {} , location {} 和 http {} 上下文:
http { #... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { #... location /search/ { limit_req zone=one; } } }
使用如上配置,nginx 在 /search/ 路由下将每秒处理不超过 1 个请求,延迟处理这些请求的方式是总速率不大于设定的速率。nginx 将延迟处理此类请求,直到 "存储区"(共享存储区 one)已满。对于到达完整存储桶的请求,nginx 将响应 503 service unavailable 错误(当 limit_req_status 未自定义设定状态码时)。
限制宽带
要限制每个连接的带宽,请使用以下 limit_rate 指令:
location /download/ { limit_rate 50k; }
通过此设置,客户端将能够通过单个连接以最高 50k/秒 的速度下载内容。但是,客户端可以打开多个连接跳过此限制。因此,如果目标是阻止下载速度大于指定值,则连接数也应该受到限制。例如,每个 ip 地址一个连接(如果使用上面指定的共享内存区域):
location /download/ { limit_conn addr 1; limit_rate 50k; }
要仅在客户端下载一定数量的数据后施加限制,请使用该 limit_rate_after 指令。允许客户端快速下载一定数量的数据(例如,文件头 - 电影索引)并限制下载其余数据的速率(使用户观看电影而不是下载)可能是合理的。
limit_rate_after 500k; limit_rate 20k;
以下示例显示了用于限制连接数和带宽的组合配置。允许的最大连接数设置为每个客户端地址 5 个连接,这适用于大多数常见情况,因为现代浏览器通常一次最多打开 3 个连接。同时,提供下载的位置只允许一个连接:
http { limit_conn_zone $binary_remote_address zone=addr:10m server { root /www/data; limit_conn addr 5; location / { } location /download/ { limit_conn addr 1; limit_rate_after 1m; limit_rate 50k; } } }
以上是Nginx如何限制http资源请求的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

要让 Tomcat 服务器对外网访问,需要:修改 Tomcat 配置文件,允许外部连接。添加防火墙规则,允许访问 Tomcat 服务器端口。创建 DNS 记录,将域名指向 Tomcat 服务器公有 IP。可选:使用反向代理提升安全性和性能。可选:设置 HTTPS 以提高安全性。

ThinkPHP Framework 的本地运行步骤:下载并解压 ThinkPHP Framework 到本地目录。创建虚拟主机(可选),指向 ThinkPHP 根目录。配置数据库连接参数。启动 Web 服务器。初始化 ThinkPHP 应用程序。访问 ThinkPHP 应用程序 URL 运行。

Node.js 项目的服务器部署步骤:准备部署环境:获取服务器访问权限、安装 Node.js、设置 Git 存储库。构建应用程序:使用 npm run build 生成可部署代码和依赖项。上传代码到服务器:通过 Git 或文件传输协议。安装依赖项:SSH 登录服务器并使用 npm install 安装应用程序依赖项。启动应用程序:使用 node index.js 等命令启动应用程序,或使用 pm2 等进程管理器。配置反向代理(可选):使用 Nginx 或 Apache 等反向代理路由流量到应用程

要解决 "Welcome to nginx!" 错误,需要检查虚拟主机配置,启用虚拟主机,重新加载 Nginx,如果无法找到虚拟主机配置文件,则创建默认页面并重新加载 Nginx,这样错误消息将消失,网站将正常显示。

Docker 环境中容器通信有五种方法:共享网络、Docker Compose、网络代理、共享卷、消息队列。根据隔离性和安全性需求,选择最合适的通信方法,例如利用 Docker Compose 简化连接或使用网络代理提高隔离性。

要将 HTML 文件转换为网址,需要使用网络服务器,包括以下步骤:获取网络服务器。设置网络服务器。上传 HTML 文件。创建域名。路由请求。

如何在C++中实现HTTP流传输?使用Boost.Asio和asiohttps客户端库创建SSL流套接字。连接到服务器并发送HTTP请求。接收HTTP响应头并打印它们。接收HTTP响应正文并打印它。

Dockerfile 中最常用的指令有:FROM:创建新镜像或派生新镜像RUN:执行命令(安装软件、配置系统)COPY:复制本地文件到镜像ADD:类似 COPY,可自动解压缩 tar 存档或获取 URL 文件CMD:指定容器启动时的命令EXPOSE:声明容器监听端口(但不公开)ENV:设置环境变量VOLUME:挂载主机目录或匿名卷WORKDIR:设置容器中的工作目录ENTRYPOINT:指定容器启动时要执行的可执行文件(类似 CMD,但不可覆盖)
