作者:寒夜孤星TM | 来源:互联网 | 2023-08-23 16:34
详解Nginx对访问量的控制是千自学中一篇关于Nginx的文章简介:目的了解Nginx的ngx_http_limit_conn_module和ngx_http_limit_req_module模块,对请求访问量进行控制。Nginx模块化
目的
了解 Nginx 的 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,对请求访问量进行控制。
Nginx 模块化
nginx 的内部结构是由核心模块和一系列的功能模块所组成。模块化架构使得每个模块的功能相对简单,实现高内聚,同时也便于对 Nginx 进行功能扩展。
针对 web 请求,Nginx 所有开启的模块会组成一条链,类似于闯关游戏中的一道道关卡,每个模块负责特定的功能,例如实现压缩的 ngx_http_gzip_module 模块,实现验证的 ngx_http_auth_basic_module 模块和实现代理的 ngx_http_proxy_module 模块等。连接到服务器的请求,会依次经过Nginx各个模块的处理,只有通过这些模块处理之后的请求才会真正的传递给后台程序代码进行处理。
Nginx 并发访问控制
对于 web 服务器而言,当遇到网络爬虫,或者恶意大流量攻击访问时,会造成服务器内存和 CPU 爆满,带宽也会跑满,所以作为成熟的服务器代理软件,需要可以对这些情况进行控制。
Nginx 控制并发的方法有两种,一种是通过IP或者其他参数控制其并发量;另外一种是控制单位时间内总的请求处理量。即对并发和并行的控制,这两个功能分别由 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块负责实现。
ngx_http_limit_conn_module 模块
说明
该模块主要用于对请求并发量进行控制。
参数配置
limit_conn_zone
指令配置 limit_conn_zone key zOne=name:size
配置的上下文:http
说明:key 是 Nginx 中的变量,通常为 binaryremoteaddr|server_name;name 为共享内存的名称,size 为该共享内存的大小;此配置会申请一块共享内存空间 name,并且保存 key 的访问情况
limit_conn_log_level
语法:limit_conn_log_level info|notice|warn|error
默认值:error
配置上下文:http,server,location
说明:当访问达到最大限制之后,会将访问情况记录在日志中
limit_conn
语法:limit_conn zone_name number
配置上下文:http,server,location
说明:使用 zone_name 进行访问并发控制,当超过 number 时返回对应的错误码
limit_conn_status
语法:limit_conn_status code
默认值:503
配置上下文:http,server,location
说明:当访问超过限制 number 时,给客户端返回的错误码,此错误码可以配合 error_page 等参数,在访问超量时给客户返回友好的错误页面
limit_rate
语法:limit_rate rate
默认值:0
配置上下文:http,server,location
说明:对每个链接的速率进行限制,rate 表示每秒的下载速度;
limit_rate_after
语法:limit_rate_after size
配置上下文:http,server,location
说明:此命令和 limit_rate 配合,当流量超过 size 之后,limit_rate 才开始生效
简单配置示例
limit_conn_zone $binary_remote_addr zOne=addr:10m;
server {
listen 80;
server_name www.domain.com;
root /path/;
index index.html index.htm;
location /ip {
limit_conn_status 503; # 超限制后返回的状态码;
limit_conn_log_level warn; # 日志记录级别
limit_rate 50; # 带宽限制
limit_conn addr 1; # 控制并发访问
}
# 当超过并发访问限制时,返回503错误页面
error_page 503 /503.html;
}
ngx_http_limit_req_module 模块
说明
该模块主要控制单位时间内的请求数。使用 “leaky bucket” (漏斗)算法进行过滤,在设置好限制 rate 之后,当单位时间内请求数超过 rate 时,模块会检测 burst 值,如果值为0,则请求会依据 delay|nodelay 配置返回错误或者进行等待;如果 burst 大于0时,当请求数大于 rate 但小于 burst 时,请求进入等待队列进行处理。
参数配置
limit_req_zone
语法:limit_req_zone key zOne=name:size rate=rate
配置上下文:http
说明:key 是 Nginx 中的变量,通常为 binaryremoteaddr|server_name;name 为共享内存的名称,size 为该共享内存的大小;rate 为访问频率,单位为 r/s 、r/m 。此配置会申请一块共享内存空间 name,并且保存 $key 的访问情况;
limit_req
语法: limit_rate zOne=name [burst=number] [nodelay|delay=number]
配置上下文:http,server,location
说明:开启限制,burst设置最多容量,nodelay决定当请求超量是,是等待处理还是返回错误码;
limit_req_log_level 和 limit_req_status 配置参数左右与ngx_http_limit_conn_module模块一致;
简单配置示例
limit_req_zone $binary_remote_addr zOne=req:10m rate=2r/m;
server {
listen 80;
server_name www.domain.com;
root /path/;
index index.html index.htm;
location /limit {
limit_req zOne=req burst=3 nodelay;
}
# 当超过并发访问限制时,返回503错误页面
error_page 503 /503.html;
}
注意
这两种访问控制都需要申请内存空间,既然有内存空间,当然会存在内存耗尽的情况,这时新的请求都会被返回错误,所以当开启访问量限制时,需要通过监控防止此类情况发生。
小结
通过对 Nginx 模块化架构的简单介绍,重点了解 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块的功能和配置参数,实现 Nginx 对请求的并发控制。如有不对,还请指教
推荐阅读
为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ...
[详细]
蜡笔小新 2024-11-10 08:42:08
Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ...
[详细]
蜡笔小新 2024-11-09 11:59:38
在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ...
[详细]
蜡笔小新 2024-11-10 08:22:07
在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ...
[详细]
蜡笔小新 2024-11-09 18:24:15
本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ...
[详细]
蜡笔小新 2024-11-07 19:20:50
本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ...
[详细]
蜡笔小新 2024-11-06 08:13:47
在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ...
[详细]
蜡笔小新 2024-11-05 19:55:55
在分析 Nginx 配置不当导致的频繁重定向问题时,发现项目根路径不为空是主要原因。为避免前后端之间的反复重定向,建议在配置中增加一层路径映射。具体配置示例如下:`server { listen 80; server_name pmp.mussessein.cn; location / { root /path/to/project; try_files $uri $uri/ /index.html; } }`。通过这种方式,可以有效减少不必要的重定向,提升用户体验和系统性能。 ...
[详细]
蜡笔小新 2024-11-05 15:17:31
本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ...
[详细]
蜡笔小新 2024-11-05 14:12:56
FastDFS Nginx 扩展模块的源代码解析与技术剖析 ...
[详细]
蜡笔小新 2024-11-04 20:15:18
本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ...
[详细]
蜡笔小新 2024-11-03 19:54:00
本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ...
[详细]
蜡笔小新 2024-11-09 19:48:22
汽车电子架构与CAN网络基础解析——鉴源实验室专业解读 ...
[详细]
蜡笔小新 2024-11-06 14:10:48
本文探讨了Nginx在处理静态和动态URL时的配置与优化技巧。通过示例展示了如何将复杂的动态URL重写为简洁的静态URL,如将`http://test.dev/televisionSearch?searchword=20&a`转换为`http://test.dev/search_sw_20_p_1.html`。此外,还介绍了如何利用Nginx的重写规则和缓存机制,提高网站性能和用户体验。 ...
[详细]
蜡笔小新 2024-11-06 13:48:22
为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ...
[详细]
蜡笔小新 2024-11-04 14:05:16