news 2026/7/31 16:49:36

Nginx在CDN加速或使用SLB代理后获取真实IP并实现并发访问限制(限流)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx在CDN加速或使用SLB代理后获取真实IP并实现并发访问限制(限流)

当用户访问网站时,在使用CDN或SLB的情况下,访问链路通常是这样的:

用户浏览器 → CDN节点/SLB节点 → 源服务器

在这种情况下,源服务器接收到的请求来源IP实际上是CDN或SLB节点的IP,而不是用户的真实IP。如果我们直接基于这个IP进行限流,就会出现以下问题:

  1. 限制了CDN/SLB节点而非真实用户
  2. 无法对真实的恶意用户进行有效拦截
  3. 限流策略失效

二、普通限流配置

在没有CDN/SLB的简单场景下,我们可以直接基于$binary_remote_addr进行限流:

## 以用户IP地址作为Key,每个IP地址最多有50个并发连接 limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m; limit_conn TotalConnLimitZone 50; limit_conn_log_level notice; ## 以用户IP地址作为Key,每个IP地址每秒处理10个请求 limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m rate=10r/s; limit_req_log_level notice; ## 具体服务器配置 server { listen 80; location ~ \.php$ { ## 最多5个排队,由于每秒处理10个请求+5个排队, ## 你一秒最多发送15个请求过来,再多就直接返回503错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } }

这种方式适用于用户直接访问源服务器的场景,但对于经过CDN/SLB代理的情况则不再适用。

三、CDN/SLB模式下的限流解决方案

1. 理解X-Forwarded-For头部

当CDN/SLB代理服务器将用户请求转发到后端服务器时,会在HTTP头中加入记录:

X-Forwarded-For: 用户IP, 代理服务器1-IP, 代理服务器2-IP, ...

经过多层代理后,用户的真实IP在第一个位置,后面会跟一串中间代理服务器的IP地址。

2. 获取真实IP的配置

http { ## 获取原始用户的真实IP地址 map $http_x_forwarded_for $clientRealIp { default $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } ## 设置IP白名单,对内部的IP不限制 map $clientRealIp $limit { default $clientRealIp; xx.xx.xx.xx ""; } ## 以真实IP为单位,限制请求数,并返回429状态; limit_req_status 429; limit_req_zone $limit zone=ConnLimitZone:20m rate=5r/s; limit_req_log_level notice; ## 以真实IP为单位,限制该IP的并发连接数,并返回429状态; limit_conn_status 429; limit_conn_zone $limit zone=TotalConnLimitZone:20m; limit_conn TotalConnLimitZone 100; limit_conn_log_level notice; ## 以访问域名为单位,限制总并发链接数; limit_conn_zone $server_name zone=SumConnLimitZone:20m; } ## 具体Server配置 server { listen 80; location ~ \.php$ { ## 限制总并发连接数 limit_conn SumConnLimitZone 10000; ## 最多5个排队,由于每秒处理10个请求+5个排队, ## 你一秒最多发送15个请求过来,再多就直接返回429错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } }

3. 配置说明

  1. map指令:用于从X-Forwarded-For头部提取用户真实IP
  2. 白名单机制:对特定IP(如内部服务器)不进行限流
  3. 三层限流策略
    • 基于真实IP的请求频率限制
    • 基于真实IP的并发连接数限制
    • 基于域名的总并发连接数限制

四、验证方法

1. 白名单测试

对于白名单内的服务器进行压测,应该全部通过。

2. 非白名单测试

对于不在白名单内的IP,最多允许通过10+5个请求,其余部分应该返回429错误。

3. 压测工具

CentOS一般自带siege压测工具:

yum -yinstallsiege# 使用方法siege -c3-r10-b https://xxxx.xx.com/api/xxxx# -c 3 表示3个用户# -r 10 表示访问10次# 以上表示:3个用户,每个用户访问10次请求,共计30次

五、调试技巧:Echo模块

为了验证配置是否正确,可以使用Nginx的echo模块进行调试:

1. 集成Echo模块

cd/usr/local/src# 下载echo模块并解压wgethttps://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gztarzxvf v0.61.tar.gz# 下载nginx并解压wgethttp://nginx.org/download/nginx-1.12.2.tar.gztar-xzvf nginx-1.12.2.tar.gzcdnginx-1.12.2/# 查看当前nginx的编译参数/usr/local/nginx/sbin/nginx -V# 在旧的编译参数基础上新增【--add-module=/echo模块的解压路径】参数,开始编译./configure --prefix=/usr/local/nginx/nginx --add-module=/usr/local/src/echo-nginx-module-0.61# make编译make-j2# 平滑升级nginxmv/usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.oldcp-f objs/nginx /usr/local/nginx/sbin/makeupgrade

2. Echo使用示例

server { listen 80; server_name yourdomain.com; ## 以下新增规则: ## 当用户访问 /ip 的时候,我们输出 $clientRealIp 和 $limit 变量, ## 看看这个变量值是不是真的 用户源IP 地址 location /ip { echo $clientRealIp; echo $limit; } }

通过访问http://xxx.xxx.cn/ip可以验证获取到的IP是否为用户真实IP。

六、最佳实践建议

  1. 合理设置限流参数:根据业务实际情况调整请求频率和并发连接数限制
  2. 维护白名单:将内部服务器、合作伙伴服务器等加入白名单
  3. 监控告警:建立完善的监控体系,及时发现异常流量
  4. 渐进式部署:先在测试环境验证,再逐步推广到生产环境
  5. 定期评估:根据业务发展定期评估和调整限流策略

结语

通过合理配置Nginx的限流模块,即使在复杂的CDN/SLB架构下,我们也能有效识别用户真实IP并实施精准的访问控制。这不仅能够保护服务器免受恶意攻击,还能确保正常用户的访问体验。在实际应用中,需要根据具体的业务场景和安全要求来调整相关参数,以达到最佳的防护效果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 16:43:22

stm32毕业论文(毕设)必过选题怎么选

文章目录1前言2 如何选题3 选题方向2.1 嵌入式开发方向2.2 物联网方向2.3 移动通信方向2.4 人工智能方向2.5 算法研究方向2.6 移动应用开发方向2.7 网络通信方向3.4 学长作品展示4 最后1前言 &#x1f947; 近期不少学弟学妹询问学长关于电子信息工程专业相关的毕设选题&#…

作者头像 李华
网站建设 2026/7/31 4:49:00

渗透测试流程到底是什么?这篇给你讲清楚(超详细)

渗透测试流程到底是什么&#xff1f;这篇给你讲清楚(超详细) 0x01 主动扫描 通常来说&#xff0c;我们会先使用类似于AWVS 、Appscan等工具进⾏主动扫描&#xff1b;主动扫描这个过程主要旨在使用自动化工具解放双手发现漏洞。 对于主动扫描的软硬件产品&#xff0c;使用的方…

作者头像 李华
网站建设 2026/7/30 20:07:23

Graph增强Agent实战指南:解决LLM智能体的核心痛点!

简介 文章介绍图增强大型语言模型智能体&#xff08;GLA&#xff09;如何解决纯LLM智能体的规划不可靠、记忆低效、工具调用混乱等问题。通过图结构&#xff0c;GLA实现了可靠性、效率、可解释性和灵活性提升。文章详细探讨了图结构在单智能体规划、记忆管理和工具管理中的应用…

作者头像 李华
网站建设 2026/7/30 14:14:10

好写作AI范式通译:如何成为跨学科研究的“学术翻译官”?

在跨学科研究中&#xff0c;最难的或许不是理解另一个领域的知识&#xff0c;而是用对方的“学术方言”进行优雅对话——这恰是智能工具最能大显身手之处。好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/跨学科写作的“巴别塔困境”研究者穿梭于不同领域时常遇此窘境&…

作者头像 李华
网站建设 2026/7/31 0:52:25

JavaScript DOM 原生部分(三):元素属性修改

文章目录一.修改标准 HTML 内置属性1.直接通过属性名操作( 推荐,更简洁 )2.使用 setAttribute() / getAttribute() ( 通用方法 )二.修改样式属性( style / classList )1.修改行内样式( element.style )2.修改类样式( classList ,推荐)三.修改自定义数据属性( data-*)四.特殊属性…

作者头像 李华
网站建设 2026/7/31 5:29:29

【VSCode量子硬件连接日志解密】:揭秘量子计算调试的幕后核心技巧

第一章&#xff1a;VSCode量子硬件的连接日志在现代量子计算开发中&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已成为集成开发环境的首选。通过扩展插件与远程量子设备建立稳定连接&#xff0c;开发者能够实时提交量子电路并获取测量结果。连接过程中的日志…

作者头像 李华