Nginx | stream 四层反向代理:PREACCESS、ACCESS 阶段并发与访问限制模块浅析与实践 📅 发布时间:2026/7/11 2:43:29 👁️ 浏览次数: [ 知识是人生的灯塔只有不断学习才能照亮前行的道路 ] 大家好我是 WeiyiGeek一名深耕安全运维开发SecOpsDev领域的技术从业者致力于探索DevOps与安全的融合DevSecOps自动化运维工具开发与实践企业网络安全防护欢迎各位道友一起学习交流、一起进步 若此文对你有帮助一定记得点个关注⭐与小红星❤️或加入到作者知识星球『 全栈工程师修炼指南』转发收藏学习不迷路 。PREACCESS阶段◆ limit_conn 模块描述上文《Nginx | stream 四层反向代理LOG、POST_ACCEPT阶段模块指令浅析与实践》作者讲解实践了在四层代理场景下使用 proxy protocol 协议获取客户端真实IP不过前提是开发的客户端应用需要支持发送 proxy protocol 协议数据包然后通过 readip 模块处理后获取到真实 IP 地址先在我们拿到真实 IP 之后就可以在 PREACCESS 阶段使用 limit_conn 模块用于限制并发连接数。温馨提示若文章代码块中存在乱码或不能复制请联系作者也可通过文末的阅读原文链接加入知识星球中阅读原文链接https://articles.zsxq.com/id_wtv12vsjglt0.htmlnginx_stream_limit_conn_module 模块用于限制每个客户端的并发连接数利用变量自定义限制依据使用共享内存在所有 worker 进程中同步连接状态它已经默认编译进 Nginx可通过--without-stream_limit_conn_module编译选项禁用该指令设计与 http 模块类似需要先定义共享内存区域然后使用 limit_conn 指令指定共享区域以及基于什么特征进行限制的连接数指令使用示例stream { limit_conn_zone $binary_remote_addr zoneaddr:10m; ... server { ... limit_conn addr 1; limit_conn_log_level error; } }温馨提示对于stream模块仅存在limit_conn而无limit_req概念因其面向TCP连接而非HTTP请求。指令参数•limit_conn_zone指令用于定义共享内存区域及大小以便在多个 worker 之间同步连接状态例如存放客户端连接数。Syntax: limit_conn_zone key zonename:size; Default: — Context: stream # IPV4 为四字节32位IPV6 为十六字节64位1m 大约存储3.2W个IPV4地址,1.6W IPV6 地址, 如果区域存储已耗尽服务器将关闭连接。 limit_conn_zone $binary_remote_addr zoneaddr:10m;•limit_conn指令用于为给定键值设置共享内存区域和允许的最大连接数例如基于客户端IP地址的限制。Syntax: limit_conn zone number; Default: — Context: stream, server•limit_conn_dry_run指令用于在限制连接时模拟执行但不实际断开连接主要用于调试和测试。Syntax: limit_conn_dry_run on | off; Default: limit_conn_dry_run off; Context: stream, server•limit_conn_log_level指令用于设置日志级别当连接被限制时记录的日志等级。Syntax: limit_conn_log_level info | notice | warn | error; Default: limit_conn_log_level error; Context: stream, server另外该模块1.17.6还内置了一个变量$limit_conn_status用于指示连接是否被限制其值可以是PASSED,REJECTED, 或REJECTED_DRY_RUN。好了这里便简单介绍这里由于模块使用比较简单所以作者将在后续 ACCESS 阶段中再实践使用 limit_conn 模块限制客户端并发连接数。ACCESS阶段◆ access 模块描述ngx_stream_access_module 模块(1.9.2)提供了 access 控制指令用于在 ACCESS 阶段中根据客户端IP地址控制连接的允许或拒绝它默认编译进 Nginx可通过--without-stream_access_module编译选项禁用。指令参数•allow指令用于允许特定IP地址或子网访问。Syntax: allow address | CIDR | unix: | all; Default: — Context: stream, serve•deny指令用于拒绝特定IP地址或子网访问。Syntax: deny address | CIDR | unix: | all; Default: — Context: stream, server简单示例其优先级按指令配置顺序依次检查直到匹配上第一个规则后然后终止检查简单的说可写多条allow/deny指令按顺序匹配第一条匹配规则生效。server { ... deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }实例演示作者将基于 proxy protocol 协议获取客户端真实IP然后分别演示在 PREACCESS 阶段使用limit_conn模块限制客户端并发连接数以及在 ACCESS 阶段使用access模块限制特定或仅允许某 IP 的访问。步骤 01.编辑 Nginx 配置文件在 stream 块中启用 proxy protocol 并设置 limit_conn 和 access 控制。tee /usr/local/nginx/conf/nginx.conf EOF worker_processes auto; error_log /var/log/nginx/error.log debug; events { worker_connections 1024; } # stream 模块配置块 stream { # 定义一个共享内存区域用于存储连接状态 limit_conn_zone $binary_remote_addr zonesrc_addr:10m; # 定义一个日志模式格式加入了 $limit_conn_status 变量以便记录连接是否被限制。 log_format basic $remote_addr:$remote_port $realip_remote_addr:$realip_remote_port [$time_local] $protocol $status $bytes_sent $bytes_received $session_time $limit_conn_status; # 开启日志文件描述符缓存减少打开和关闭文件的开销 open_log_file_cache max1000 inactive60s min_uses2 valid1m; # 定义一个四层TCP服务 server { # 监听 8090 端口启用 proxy protocol listen 8090 proxy_protocol; # 设置读取 proxy protocol 数据的超时时间 proxy_protocol_timeout 15s; # 设置可信客户端IP地址即真实地址将排除下述IP或IP段的地址。 set_real_ip_from 127.0.0.1; set_real_ip_from 10.20.172.0/24; # 限制每个客户端的并发连接数此处设置为1 limit_conn src_addr 1; # 设置日志级别当连接被限制时记录的日志等级设置为 error 可调低日志级别以减少日志量。 limit_conn_log_level error; # 使用 access 控制指令允许特定IP地址或子网访问。 allow 222.177.8.0/24; deny all; # 拒绝所有其他IP地址的访问。 # 开启访问日志记录注意这里为了测试未启用缓存生产环境中推荐使用缓存。 access_log /var/log/nginx/stream.log basic; # 返回客户端真实IP和端口并打印其他相关信息以验证请求。 returnHello World, proxy_protocol ! hostname: $hostname pid: $pid nginx_version: $nginx_version protocol: $protocol remote_addr: $remote_addr remote_port: $remote_port server_addr: $server_addr server_port: $server_port realip_remote_addr: $realip_remote_addr realip_remote_port: $realip_remote_port proxy_protocol_addr: $proxy_protocol_addr proxy_protocol_port: $proxy_protocol_port bytes_received: $bytes_received bytes_sent: $bytes_sent session_time: $session_time status: $status limit_conn_status: $limit_conn_status msec: $msec time_iso8601: $time_iso8601\n; } } EOF步骤 02.重新加载 Nginx 配置并测试 limit_conn 控制是否生效例如可使用 telnet 或者 python 脚本模拟客户端同时连接验证我们在 nginx 配置文件中同一时刻只能有一个连接获取到响应以及在 ACCESS 阶段仅允许特定IP访问。nginx -t nginx -s reload # 这里使用上文中的 send_proxy_protocol_v2.py 脚本以及 mobaXterm 工具测试。 python3 send_proxy_protocol_v2.py 222.177.8.188 58126 # 或者使用 telnet 测试 V1 版本。 PROXY TCP4 222.177.8.188 10.20.172.214 58126 8080weiyigeek.top-验证 limit_conn 与 allow 指令图步骤 03.验证ACCESS阶段仅允许特定IP访问例如尝试使用其他 IP 地址连接会发现访问被拒绝通过日志与操作验证了access模块的生效。$ tail -f /var/log/nginx/stream.log # 步骤 02 操作结果 222.177.8.188:58126 10.20.172.213:33058 [26/Jan/2026:16:27:09 0800] TCP 200 0 0 0.000 PASSED# 允许访问会话状态码 200表明连接成功。 222.177.8.188:58126 10.20.172.213:49256 [26/Jan/2026:16:27:19 0800] TCP 503 0 0 0.000 REJECTED# limit_conn 控制生效访问被拒绝会话状态码 503。 # 步骤 03 操作结果 202.12.144.236:58126 10.20.172.213:60108 [26/Jan/2026:16:52:57 0800] TCP 403 0 0 1.111 PASSED# limit_conn 控制未生效但 access 模块拒绝访问返回 403 222.177.8.230:58126 10.20.172.213:47632 [26/Jan/2026:16:53:41 0800] TCP 200 0 0 0.641 PASSED# 允许访问会话状态码 200表明连接成功。weiyigeek.top-验证 ACCESS 模块指令效果图本小节介绍与实践了通过proxy protocol协议获取客户端真实IP然后在PREACCESS和ACCESS阶段分别使用limit_conn和access模块进行限制并发和IP访问控制以及在 Log 阶段中使用 log 模块记录每条连接的详细日志便于问题定位与行为分析同时支持自定义格式与文件描述符缓存。END加入作者【全栈工程师修炼指南】知识星球『 全栈工程师修炼指南』星球主要涉及全栈工程师Full Stack Development实践文章持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生Cloud Native、物联网工业控制IOT、人工智能Ai从业书籍笔记人生职场认识等方面资料或文章。Q: 加入作者【全栈工程师修炼指南】星球后有啥好处✅ 将获得作者最新工作学习实践文章以及网盘资源。✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友也可单次购买)✅ 将获得作者专门答疑学习交流群解决在工作学习中的问题。✅ 将获得作者远程支持在作者能力范围内且合规。获取作者工作学习全栈笔记作者整理了10年的工作学习笔记涉及网络、安全、运维、开发需要学习实践笔记的看友可添加作者微信或者回复【工作学习实践笔记】当前价格299除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持希望大家多多支持收获定大于付出知识推荐往期文章【最新】告别杂乱审计日志多厂商网络设备日志统一采集与可视化分析最佳实践【最新】Categraf | 国产化采集器实现SQL Server 数据库指标采集、可视化、异常告警全流程【最新】Categraf | 国产化采集器实战MySQL 指标采集、可视化、异常告警全流程【最新】Ops实践 | 从零开始Prometheus通过IPMI协议抓取服务器硬件设备指标并可视化展示【相关】Nginx | stream 四层反向代理LOG、POST_ACCEPT阶段模块指令浅析与实践【相关】Nginx | 核心知识150讲百万并发下性能优化之四层反向代理七个阶段浅析及核心模块实践【相关】Nginx | v2 模块告别HTTP1.1开启多路复用与资源推送【相关】Nginx | open_file_cache 功能实现解决频繁 open/close 的性能顽疾若文章对你有帮助请将它转发给更多的看友若有疑问的小伙伴可在评论区留言你想法哟
AnythingtoRealCharacters2511 ComfyUI工作流详解:节点逻辑、权重调节与输出控制 AnythingtoRealCharacters2511 ComfyUI工作流详解:节点逻辑、权重调节与输出控制 你有没有试过把喜欢的动漫角色一键变成真人风格?不是简单滤镜,而是保留神态、发型、服饰细节,同时让皮肤质感、光影关系、五官结构都符合真实人物… 2026/7/10 18:47:56
211本科,月薪4k,这是侮辱大学生吗? 大家好,我是播妞。找工作时怕没有offer,真有offer了又怕薪资太低。最近,很多高学历同学就有这样的困扰。比如这位楼主,发帖说自己是211本科学历,但是拿到的offer是实习2k,转正也才4k!截图来源牛… 2026/7/9 4:03:21
把年会办成演唱会,追觅果然“敢梦敢为” 2月4日,苏州奥体中心体育场灯光璀璨,追觅科技与央视携手打造的“敢梦敢为追觅之夜”演唱会正式登场。这不仅是一次动人的视听盛宴,更是一份献给追觅全体员工的温暖心意。活动突破传统企业年会的活动形式,以央视级演唱会盛典&#… 2026/7/9 8:42:42
智能路灯通信方案对比:PLC vs GPRS vs 光纤,3种方案成本与实测分析 智能路灯通信方案深度对比:PLC、GPRS与光纤的技术抉择与成本优化技术选型的核心考量维度在智慧城市基础设施建设中,路灯通信方案的选择直接影响着系统可靠性、运维成本和长期扩展性。面对PLC(电力线载波)、GPRS(通用分… 2026/7/11 2:39:33
大数据毕设项目: 基于 Python 的微博热搜用户关注度分析系统的设计与实现 基于 Python 的热门微博动态数据研判系统(源码+文档,讲解、调试运行,定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/11 2:39:33
把AI写小说“写崩”这件事,拆开给你看。 我有个朋友,写网文的,签了约。 写了三年多,最高光的月份能赚六位数,平台推荐位拿到手软。 但后来,他整个人变了。 那段时间,每次约他吃饭,他都黑着一张脸,手机屏幕永远是文档界面。 … 2026/7/11 2:37:33
三兄妹98%控股,女儿管审计,文峰光电把“家族上市”刻进了DNA 7月10日,淮南文峰光电科技股份有限公司(简称文峰光电)迎来北交所上会审核。2023至2025年(报告期)文峰光电受行业竞争加剧、铜银及进口绝缘材料涨价影响,业绩波动明显,毛利率持续承压。公司高端绝… 2026/7/11 2:35:32
GPT-5.6三档模型怎么选?Sol、Terra和Luna区别讲清楚 GPT-5.6上线后,Codex里出现了Sol、Terra和Luna三档模型。不少用户看到模型名称后的第一反应是:哪个模型能力最强?日常写代码应该选哪个?是不是一直使用Sol效果最好?OpenAI对三款模型的定位比较明确:Sol主打… 2026/7/11 2:33:32
Android 模拟定位 3 种方案对比:系统 API、Xposed Hook 与 HAL 层修改 Android模拟定位技术全景解析:从系统API到深度定制方案在移动应用开发和测试领域,位置服务已成为不可或缺的核心功能。无论是导航类应用的路线规划,社交平台的附近好友推荐,还是电商App的区域化营销,精准的位置信息都扮… 2026/7/11 2:33:32
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08