当前位置: 首页 > article >正文

Nginx反向代理SSE长连接:配置优化与性能调优实战

1. 为什么需要Nginx反向代理SSE长连接最近在做一个实时数据监控项目时遇到了一个棘手的问题当有大量客户端同时连接SSE服务时后端服务器直接崩溃了。这让我意识到像SSE这样的长连接服务如果没有合适的代理层做缓冲和负载均衡很容易把后端压垮。Nginx作为反向代理正好能解决这个问题。SSEServer-Sent Events是一种基于HTTP的长连接技术它允许服务器主动向客户端推送数据。与WebSocket不同SSE是单向通信仅服务端到客户端但实现更简单兼容性更好。在实际项目中我经常用它来做实时日志推送、股票行情更新这类场景。但SSE长连接会带来几个挑战每个连接都会占用一个线程/进程资源连接可能持续几小时甚至几天高并发时系统资源消耗大这就是为什么需要Nginx反向代理。Nginx采用事件驱动架构能轻松hold住上万并发连接而且它的缓冲机制可以保护后端服务不被突发流量打垮。我在实际项目中测试过同样的后端服务加上Nginx反向代理后承载能力提升了5倍不止。2. Nginx基础配置实战2.1 最小化SSE代理配置先来看一个最基本的SSE代理配置。假设我们的后端服务运行在3000端口下面这段配置可以让Nginx代理SSE请求location /sse { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Connection ; proxy_buffering off; }这几个参数是关键proxy_http_version 1.1必须使用HTTP/1.11.0不支持长连接Connection 清除默认的close头保持连接不关闭proxy_buffering off禁用缓冲数据实时传输我第一次配置时就栽在proxy_buffering这个参数上。当时发现客户端总是要等好几秒才能收到数据查了半天文档才发现Nginx默认会缓冲响应数据。关闭缓冲后数据就能实时推送到客户端了。2.2 连接保持与超时控制SSE连接通常会维持很长时间但Nginx默认的超时设置并不友好location /sse { proxy_read_timeout 24h; proxy_send_timeout 24h; keepalive_timeout 24h; }这里我设置了24小时的超时时间。为什么要这么长因为在生产环境中我遇到过客户端网络波动导致连接意外断开的情况。设置较长的超时可以避免频繁重连。但要注意超时时间也不是越长越好。曾经有个项目设置了7天超时结果导致大量僵尸连接占用资源。后来我们改成了4小时配合客户端自动重连机制效果更好。3. 高级调优策略3.1 负载均衡与健康检查当流量较大时单台后端服务肯定撑不住。Nginx的负载均衡功能就派上用场了upstream sse_backend { server 10.0.0.1:3000 max_fails3 fail_timeout30s; server 10.0.0.2:3000 max_fails3 fail_timeout30s; keepalive 100; } location /sse { proxy_pass http://sse_backend; proxy_next_upstream error timeout invalid_header http_500; }这里有几个实用技巧max_fails和fail_timeout实现自动熔断keepalive复用后端连接减少握手开销proxy_next_upstream指定在哪些情况下切换到下一个后端我在实际部署时还加上了健康检查location /health { proxy_pass http://sse_backend; proxy_next_upstream error timeout; }然后让监控系统定期请求这个接口确保后端服务正常。3.2 流量控制与限速SSE服务容易被滥用比如某个客户端频繁重连。我们可以用这些参数防护location /sse { limit_conn sse_zone 10; limit_rate 100k; }limit_conn限制每个IP的连接数limit_rate控制传输速率。这两个值需要根据业务特点调整。比如在股票行情系统中我把限速设为50k既保证数据及时性又防止带宽被占满。4. 性能监控与问题排查4.1 关键指标监控要保证SSE服务稳定必须监控这些指标活跃连接数ngx_http_stub_status_module后端响应时间错误率我的监控配置长这样location /nginx_status { stub_status; allow 10.0.0.0/8; deny all; }然后在Prometheus中配置采集设置合适的告警阈值。当活跃连接数超过5000时触发告警这样能提前发现性能问题。4.2 常见问题排查在实际运维中我遇到过几个典型问题数据延迟检查proxy_buffering是否关闭后端是否有阻塞操作连接频繁断开调整proxy_read_timeout检查网络状况高负载优化后端代码增加limit_conn限制有个特别难排查的问题是内存泄漏。后来发现是Nginx的worker_connections设置太小导致频繁创建新连接。调整这个参数后问题解决events { worker_connections 10000; }5. 实战经验分享在最近的一个物联网项目中我们需要向数千台设备推送配置更新。最初直接使用SSE结果服务经常崩溃。后来通过Nginx反向代理优化系统稳定性大幅提升。具体做了这些改进将worker_processes设置为CPU核心数调整内核参数增加最大文件描述符数使用tcp_nopush和tcp_nodelay优化网络传输启用gzip压缩注意要设置gzip_min_length避免小包压缩最终配置如下http { gzip on; gzip_min_length 1024; tcp_nopush on; tcp_nodelay on; server { location /sse { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ; proxy_read_timeout 4h; proxy_buffering off; } } }这套配置经受住了双十一级别的流量考验稳定运行了半年多。关键是要根据实际业务特点不断调整参数没有放之四海而皆准的最优配置。

相关文章:

Nginx反向代理SSE长连接:配置优化与性能调优实战

1. 为什么需要Nginx反向代理SSE长连接 最近在做一个实时数据监控项目时,遇到了一个棘手的问题:当有大量客户端同时连接SSE服务时,后端服务器直接崩溃了。这让我意识到,像SSE这样的长连接服务,如果没有合适的代理层做缓…...

3分钟搞定B站视频下载:BiliDownloader终极免费解决方案

3分钟搞定B站视频下载:BiliDownloader终极免费解决方案 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 还在为无法下载B站视频而烦恼…...

AS2785 AC输入50-260V或DC输入20-450V 电流10mA,输出2.7V/3.3V/5V

1、方案名称:AS2785 AC输入50-260V或DC输入20-450V 电流10mA,输出2.7V/3.3V/5V2、品牌:紫源微(Zymicro)3、描述:AS2785是一款高性能线性稳压器,提供高达450V DC的非常宽的工作输入电压范围&…...

Bebas Neue字体终极指南:从快速安装到专业应用

Bebas Neue字体终极指南:从快速安装到专业应用 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue字体是全球最受欢迎的几何无衬线字体之一,这款开源字体以其简洁现代的设计语言和…...

跨平台资源下载神器:5分钟掌握多平台内容批量获取技巧

跨平台资源下载神器:5分钟掌握多平台内容批量获取技巧 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容…...

原神模型导入终极指南:GIMI工具完整使用教程

原神模型导入终极指南:GIMI工具完整使用教程 【免费下载链接】GI-Model-Importer Tools and instructions for importing custom models into a certain anime game 项目地址: https://gitcode.com/gh_mirrors/gi/GI-Model-Importer 想要为《原神》角色打造独…...

解锁C语言中的多返回值技巧

在C语言编程中,常常会遇到需要从函数中返回多个值的情况。虽然C语言不直接支持多返回值,但我们可以通过一些技巧来实现这一目的。本文将详细探讨如何在C语言中返回多个值,并通过实例说明。 一、背景介绍 在C语言中,函数默认只能返回一个值。这对于需要处理多个结果的情况…...

ANSYS Workbench新手避坑:用BEAM188单元模拟工字钢悬臂梁,从建模到后处理完整流程

ANSYS Workbench新手避坑:用BEAM188单元模拟工字钢悬臂梁,从建模到后处理完整流程 工字钢悬臂梁在工程实践中极为常见,从建筑阳台到机械臂设计,这种结构几乎无处不在。对于刚接触有限元分析的工程师或学生来说,如何在A…...

避开Fluent计算崩溃:用这3种网格划分策略彻底解决floating error问题

避开Fluent计算崩溃:3种网格划分策略彻底解决floating error问题 在CFD仿真工程师的日常工作中,没有什么比看到"floating point error"这个报错更令人沮丧的了。这个看似简单的错误提示背后,往往隐藏着复杂的数值计算问题。根据我们…...

Jetson Nano上MediaPipe GPU加速实战:从编译到部署,让你的AI应用帧率翻倍

Jetson Nano上MediaPipe GPU加速实战:从编译到部署,让你的AI应用帧率翻倍 在嵌入式AI领域,Jetson Nano凭借其出色的GPU性能成为众多开发者的首选平台。然而,当我们将Google的MediaPipe框架部署到这块开发板上时,默认的…...

【豆包从入门到精通共10篇】007、多模态应用:图像理解与生成能力探索

007、多模态应用:图像理解与生成能力探索 从一次深夜调试说起 上周三凌晨两点,我被测试组的紧急电话叫醒:“你们那个图像描述接口,传了张电路板照片,返回的结果是‘一只猫在玩毛线球’。” 我瞬间清醒——这问题可太致命了。我们的模型在标准数据集上准确率明明有92%,怎…...

别再死记OSPF网络类型了!通过一个跨网段实验,彻底搞懂P2P和Broadcast的区别

从实验视角拆解OSPF网络类型:P2P与Broadcast的本质差异 在准备CCNA/CCNP认证的过程中,OSPF网络类型总是一个让人头疼的知识点。许多学习者习惯性地死记硬背各种类型的特性,却很少思考它们在实际网络中的行为差异。今天,我们将通过…...

Navicat重置试用期终极指南:3种方法彻底解决14天限制

Navicat重置试用期终极指南:3种方法彻底解决14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navic…...

数字信号处理:FIR与IIR滤波器原理与应用指南

1. 离散时间滤波器基础概念离散时间滤波器是数字信号处理系统的核心构建模块,它将输入序列通过数学运算转换为输出序列。从数学角度看,线性时不变(LTI)滤波器可以完全由常系数差分方程描述。这类系统具有两个关键特性:线性性:系统…...

如何在Linux上构建专业的Jellyfin媒体播放中心?

如何在Linux上构建专业的Jellyfin媒体播放中心? 【免费下载链接】tsukimi A simple third-party Jellyfin client for Linux 项目地址: https://gitcode.com/gh_mirrors/ts/tsukimi Tsukimi是一款专为Linux系统设计的第三方Jellyfin客户端,采用GT…...

13、c#线程

1 简介 1.1 概念 进程:正在运行的程序 线程:正在运行的程序中 正在执行的代码块 ​比喻:进程是正在开工的工厂线程是正在运行的流水线一个进程中只要有一个线程::::::&…...

如何用Autolabel自动化数据标注提升25-100倍效率?

如何用Autolabel自动化数据标注提升25-100倍效率? 【免费下载链接】autolabel Label, clean and enrich text datasets with LLMs. 项目地址: https://gitcode.com/gh_mirrors/au/autolabel 在人工智能时代,高质量标注数据是模型成功的核心要素。…...

VUE--项目问题

1. useRouter()&#xff1a;拿到路由器&#xff0c;可以查看路由以及使用路由器的方法们2. <el-menu-item v-for"item in router.options.routes[0].children" :index"item.path">router.options.routes[0].children 这个是路由表里的第一个路…...

百度网盘秒传脚本:告别文件链接失效,三步实现永久分享

百度网盘秒传脚本&#xff1a;告别文件链接失效&#xff0c;三步实现永久分享 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否曾因百度网盘分享链接突…...

VMware Workstation 16 保姆级教程:手把手教你安装凤凰OS(附解决启动黑屏的nomodeset参数)

VMware Workstation 16 零基础实战&#xff1a;凤凰OS安装全攻略与深度优化指南 当Windows用户第一次听说能在PC上运行完整的安卓系统时&#xff0c;眼睛总会亮起好奇的光芒。PhoenixOS&#xff08;凤凰OS&#xff09;作为x86架构下最成熟的安卓桌面解决方案之一&#xff0c;通…...

Docker 27调度器源码级解读(commit #a7f2e1d):为什么你的Llama-3-70B容器总被错误kill?

第一章&#xff1a;Docker 27调度器架构演进与Llama-3-70B容器异常终止现象综述Docker 27 引入了重构后的容器调度器&#xff08;Scheduler v2&#xff09;&#xff0c;其核心从原先基于事件轮询的同步调度模型&#xff0c;转向基于 CRD&#xff08;Custom Resource Definition…...

《重构:改善既有代码的设计》——以Java之名,重拾代码之美

这不是一本读一遍就够的书&#xff0c;这是一本值得放在手边反复翻阅的编程之道。引子&#xff1a;一本改变了无数程序员的书1999年&#xff0c;Martin Fowler的《Refactoring: Improving the Design of Existing Code》首次面世&#xff0c;在软件开发领域投下了一颗重磅炸弹。…...

番茄小说下载器完整教程:5步打造永不消失的个人数字图书馆

番茄小说下载器完整教程&#xff1a;5步打造永不消失的个人数字图书馆 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾经为心爱的小说突然下架而心痛&#xff1f;是否因为网络信号…...

YOLOv5-CSPOpt:基于跨阶段局部优化的特征融合改进算法详解与实现

摘要 YOLOv5作为目标检测领域的主流算法,其核心组件CSP(Cross Stage Partial)结构在特征提取与梯度流优化方面展现出优异性能。本文针对原始CSP结构存在的特征冗余、计算效率瓶颈以及多尺度信息融合不充分等问题,提出了一种改进的跨阶段局部优化结构——CSPOpt。该改进方案…...

结合自适应阈值NMS的YOLOv5密集目标检测:原理详解与完整代码实现

摘要 在密集目标检测场景(如行人检测、细胞检测、拥挤场景车辆检测)中,传统非极大值抑制(NMS)算法由于采用固定阈值,容易造成漏检或误检。本文提出一种结合自适应阈值NMS的YOLOv5改进方法,通过动态计算每个检测框的自适应抑制阈值,显著提升密集场景下的检测性能。文章…...

结合批量重归一化(BRN)的YOLOv5训练稳定性优化:从理论到实践全解析

摘要 在目标检测任务中,YOLOv5凭借其出色的速度与精度平衡成为工业界和学术界的首选模型之一。然而,随着网络深度增加和批量大小受限,传统的批量归一化(Batch Normalization, BN)面临训练不稳定、小批量性能下降等问题。本文提出将批量重归一化(Batch Renormalization, …...

3D-Tiles-Tools深度解析:如何实现大规模3D地理空间数据的高性能格式转换?

3D-Tiles-Tools深度解析&#xff1a;如何实现大规模3D地理空间数据的高性能格式转换&#xff1f; 【免费下载链接】3d-tiles-tools 项目地址: https://gitcode.com/gh_mirrors/3d/3d-tiles-tools 在数字孪生、智慧城市和地理信息系统领域&#xff0c;大规模3D数据的格式…...

NVIDIA Profile Inspector深度解析:如何解锁显卡隐藏性能的7个关键技术

NVIDIA Profile Inspector深度解析&#xff1a;如何解锁显卡隐藏性能的7个关键技术 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 当你面对游戏帧率波动、画面撕裂或显卡性能未充分发挥时&#xff0c;…...

Fluent环境变量配置全解析:从原理到实践,为什么你的UDF总是编译失败?

Fluent环境变量配置全解析&#xff1a;从原理到实践&#xff0c;为什么你的UDF总是编译失败&#xff1f; 在工程仿真领域&#xff0c;Fluent的UDF&#xff08;用户自定义函数&#xff09;是扩展软件功能的利器&#xff0c;但无数工程师在配置环境变量时折戟沉沙。你是否经历过这…...

用Python给图片藏个小秘密:手把手教你实现LSB隐写术(附完整代码)

用Python给图片藏个小秘密&#xff1a;手把手教你实现LSB隐写术&#xff08;附完整代码&#xff09; 你是否想过在朋友圈分享的照片里藏一段悄悄话&#xff1f;或是把重要信息伪装成普通图片&#xff1f;这听起来像间谍电影里的情节&#xff0c;但用Python只需几十行代码就能实…...