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

Nginx WebSocket 长连接及数据容量配置

WebSocket 协议是实现实时通信的关键技术。相比于传统的 HTTP 请求-响应模式,WebSocket 提供了双向、持久化的通信方式。Nginx 作为一个高性能的反向代理服务器,可以非常有效地处理 WebSocket 连接,但要正确处理 WebSocket 长连接和传输大数据,必须进行一些特定的配置。

1. WebSocket 连接的基本概念

WebSocket 协议是基于 HTTP 协议的,它在客户端和服务器之间建立了一条持久化的、全双工的通信通道。在 WebSocket 建立连接后,客户端和服务器可以随时向对方发送消息,而不需要像传统的 HTTP 请求那样重复建立连接。

Nginx 的作用通常是充当反向代理,它将 WebSocket 请求转发给后端应用服务器。因此,在配置 WebSocket 时,需要特别注意以下几点:

  • WebSocket 的连接是持久化的,可能会存在较长的生命周期。
  • WebSocket 数据传输速度可能较快,传输的数据包可能比较大。
  • 默认的 Nginx 配置不一定适合 WebSocket 长连接,因此需要进行相应的优化。
2. Nginx 配置 WebSocket 代理

Nginx 本身并不直接支持 WebSocket 协议,但它可以通过 HTTP 代理将 WebSocket 请求转发到后端应用服务器。要使 Nginx 支持 WebSocket,关键是配置反向代理时保持 HTTP 协议升级(Upgrade)和连接(Connection)的头部。

以下是配置 Nginx 作为 WebSocket 代理的基本步骤。

2.1 配置 WebSocket 代理

在 Nginx 中,要支持 WebSocket,最重要的配置是正确设置 Upgrade和 Connection请求头,确保 WebSocket 协议的握手能够正常进行。你可以在 nginx.conf中的 location块中添加以下配置:

server {????listen 80;????server_name your-domain.com;????location /ws/ {????????proxy_pass http://your_backend_server; ?# 后端 WebSocket 服务地址????????proxy_http_version 1.1; ?# 使用 HTTP/1.1 协议,WebSocket 需要支持 HTTP/1.1????????proxy_set_header Upgrade $http_upgrade; ?# WebSocket 升级头部????????proxy_set_header Connection 'upgrade'; ?# 保持连接活跃????????proxy_set_header Host $host; ?# 转发原始 Host 头????????proxy_cache_bypass $http_upgrade; ?# 避免缓存 WebSocket 请求????}}
2.2 解释配置项
  • proxy_http_version 1.1;:WebSocket 协议需要基于 HTTP/1.1,因此需要显式指定 HTTP 版本为 1.1。
  • proxy_set_header Upgrade $http_upgrade;:WebSocket 握手需要进行协议升级(Upgrade)。通过此配置将客户端请求中的 Upgrade头部转发给后端应用服务器。
  • proxy_set_header Connection ‘upgrade’;:指定连接升级,确保 WebSocket 连接正常建立。
  • proxy_set_header Host $host;:传递客户端的 Host 头,保持请求的原始主机头信息。
  • proxy_cache_bypass $http_upgrade;:避免缓存 WebSocket 请求,因为 WebSocket 是一个持久连接,不能被缓存。
3. 配置 WebSocket 长连接

WebSocket 是一个长连接,这意味着客户端和服务器之间的连接会保持较长时间,甚至是一直持续下去。为了确保 WebSocket 长连接的稳定性和性能,Nginx 需要处理一些与连接生命周期相关的配置。

3.1 调整 proxy_read_timeout和** proxy_send_timeout**

由于 WebSocket 长连接会在较长时间内保持活跃,因此必须增加 proxy_read_timeout和 proxy_send_timeout的超时时间。否则,如果连接空闲时间较长,Nginx 会认为连接超时并关闭连接。

server {????listen 80;????server_name your-domain.com;????location /ws/ {????????proxy_pass http://your_backend_server;????????proxy_http_version 1.1;????????proxy_set_header Upgrade $http_upgrade;????????proxy_set_header Connection 'upgrade';????????proxy_set_header Host $host;????????proxy_cache_bypass $http_upgrade;????????# 调整超时时间????????proxy_read_timeout 3600s; ?# 设置为 1 小时,确保长连接不被关闭????????proxy_send_timeout 3600s; ?# 设置为 1 小时,允许数据发送较长时间????}}
  • proxy_read_timeout:设置 Nginx 等待后端服务器响应的时间。在 WebSocket 中,连接可能处于空闲状态,因此需要一个较长的超时时间。
  • proxy_send_timeout:设置 Nginx 向后端服务器发送数据的超时时间。如果你的应用有长时间的数据传输需求,调整此配置可以避免因超时而断开连接。
3.2 调整 keepalive_timeout

在 Nginx 中,keepalive_timeout配置指定了 Nginx 在与客户端建立连接后保持连接空闲的时间。WebSocket 长连接需要足够的 keepalive_timeout时间,以便与客户端保持持续的连接。

server {????listen 80;????server_name your-domain.com;????keepalive_timeout 65s; ?# 设置为 65 秒,以确保 WebSocket 长连接稳定}

通过调整 keepalive_timeout,你可以控制 Nginx 和客户端之间保持空闲连接的时间。为了避免 WebSocket 连接被意外关闭,可以适当增加该值。

4. 配置 WebSocket 数据大小限制

WebSocket 数据传输的大小可能会较大,特别是在视频流、文件传输等场景中。Nginx 默认对请求体大小有限制,如果 WebSocket 消息的大小超过默认值,可能会导致连接失败或消息丢失。因此,需要调整 Nginx 的数据传输大小限制。

4.1 调整 client_max_body_size

client_max_body_size配置控制客户端请求的最大允许大小。对于 WebSocket 长连接,特别是涉及大数据传输的应用,可能需要调整此限制。

server {????listen 80;????server_name your-domain.com;????location /ws/ {????????proxy_pass http://your_backend_server;????????proxy_http_version 1.1;????????proxy_set_header Upgrade $http_upgrade;????????proxy_set_header Connection 'upgrade';????????proxy_set_header Host $host;????????proxy_cache_bypass $http_upgrade;????????# 调整请求体大小限制????????client_max_body_size 50M; ?# 设置最大请求体为 50MB????}}
  • client_max_body_size:此设置指定 Nginx 接收客户端请求的最大体积。WebSocket 通常用来传输小型消息,但在某些应用场景下(如视频、文件传输),消息体积可能会较大。因此,适当增加该值,以便处理大数据传输。
4.2 调整 proxy_max_temp_file_size

Nginx 还会将大数据缓存到临时文件中,proxy_max_temp_file_size配置项可以控制缓存文件的大小。

server {????listen 80;????server_name your-domain.com;????location /ws/ {????????proxy_pass http://your_backend_server;????????proxy_http_version 1.1;????????proxy_set_header Upgrade $http_upgrade;????????proxy_set_header Connection 'upgrade';????????proxy_set_header Host $host;????????proxy_cache_bypass $http_upgrade;????????# 调整最大临时文件大小????????proxy_max_temp_file_size 1024m; ?# 设置临时文件最大为 1GB????}}
5. 总结

WebSocket 提供了高效的实时通信能力,但在实际部署中,尤其是当涉及长连接和大数据传输时,必须对 Nginx 进行一些优化配置以确保连接的稳定性和高效性。

  • 通过设置合适的 proxy_read_timeout、proxy_send_timeout和 keepalive_timeout,可以确保 WebSocket 长连接在长时间没有活动的情况下仍然保持打开状态。
  • 调整 client_max_body_size和 proxy_max_temp_file_size配置,可以确保 WebSocket 能够传输大数据。
  • 保证 WebSocket 连接的升级(Upgrade)和连接保持(Connection)头部正确转发,确保 WebSocket 协议能够正常工作。

通过这些配置,你可以确保 Nginx 能够高效、稳定地代理 WebSocket 长连接,支持大数据传输,满足实时通信应用的需求。

相关文章:

Nginx WebSocket 长连接及数据容量配置

WebSocket 协议是实现实时通信的关键技术。相比于传统的 HTTP 请求-响应模式,WebSocket 提供了双向、持久化的通信方式。Nginx 作为一个高性能的反向代理服务器,可以非常有效地处理 WebSocket 连接,但要正确处理 WebSocket 长连接和传输大数据…...

Pycharm+CodeGPT+Ollama+Deepseek

首先,体验截图: 接着: 1、下载Ollama: Download Ollama on macOS 2、下载模型 以1.5b为例,打开命令行,输入: ollama run deepseek-r1:1.5b 3、Pycharm安装Code GPT插件 打开PyCharm,找到文…...

k8s Container runtime network not ready

问题 k8s 3 控制节点,docker 运行时,后期踢掉其中一个节点,使用了 containerd 运行时,但是在加入集群的时候,node 状态 notready。查看 kubelet 的日志发现如下报错 Feb 20 11:28:14 bjm3 kubelet[144781]: E0220 11:28:14.506374 144781 kubelet.go:2475] "Conta…...

阿里云k8s服务部署操作一指禅

文章目录 DockerFile镜像操作阿里云k8s服务部署 DockerFile # 使用 JDK 17 官方镜像 # linux架构:FROM --platformlinux/amd64 openjdk:17-jdk-slim # arm架构:openjdk:17-jdk-slim FROM --platformlinux/amd64 openjdk:17-jdk-slim# 设置工作目录 WORK…...

pdf-extract-kit paddle paddleocr pdf2markdown.py(效果不佳)

GitHub - opendatalab/PDF-Extract-Kit: A Comprehensive Toolkit for High-Quality PDF Content Extraction https://github.com/opendatalab/PDF-Extract-Kit pdf2markdown.py 运行遇到的问题: 错误: -------------------------------------- C Tra…...

.NET + Vue3 的前后端项目在IIS的发布

目录 一、发布准备 1、安装 IIS 2、安装 Windows Hosting Bundle(.NET Core 托管捆绑包) 3、安装 IIS URL Rewrite 二、项目发布 1、后端项目发布 2、前端项目发布 3、将项目部署到 IIS中 三、网站配置 1、IP配置 2、防火墙配置 3、跨域配置…...

交互编程工具之——Jupyter

Jupyter 是什么? Jupyter 是一个开源的交互式编程和数据分析工具,广泛应用于数据科学、机器学习、教育和研究领域。其核心是 Jupyter Notebook(现升级为 JupyterLab),允许用户在一个基于浏览器的界面中编写代码、运行…...

微信小程序客服消息接收不到微信的回调

微信小程序客服消息,可以接收到用户进入会话事件的回调,但是接收不到用户发送消息的回调接口。需要在微信公众平台,把转发消息给客服的开关关闭。需要把这个开关关闭,否则消息会直接发送给设置的客服,并不会走设置的回…...

easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题

需求背景&#xff1a;有一个需求要做下拉框的值有100多条&#xff0c;同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出&#xff0c;会出现下拉框的值过多&#xff0c;导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…...

影视大数据分析新范式:亮数据动态代理驱动的实时数据采集方案

一、项目背景与挑战 在数据驱动决策的时代&#xff0c;影视数据分析对内容平台至关重要。但豆瓣等平台设有&#xff1a; 高频请求IP封禁机制User-Agent指纹检测请求频率阈值控制验证码验证系统 传统爬虫方案面临&#xff1a; 单一IP存活时间<5分钟采集成功率<30%数据更新…...

免费体验,在阿里云平台零门槛调用满血版DeepSeek-R1模型

一、引言 随着人工智能技术的飞速发展&#xff0c;各类AI模型层出不穷。其中&#xff0c;DeepSeek作为一款新兴的推理模型&#xff0c;凭借其强大的技术实力和广泛的应用场景&#xff0c;逐渐在市场中崭露头角。本文将基于阿里云提供的零门槛解决方案&#xff0c;对DeepSeek模…...

ok113i平台——多媒体播放器适配

1. 视频播放支持 1.1 在Linux平台交叉编译ffmpeg动态库&#xff0c;详情查看《ok113i平台——交叉编译音视频动态库》 提取如下动态库&#xff1a; libavcodec.so.58.134.100 libavdevice.so.58.13.100 libavfilter.so.7.110.100 libavformat.so.58.76.100 libavutil.so.56.…...

使用Python中的`gensim`库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论

下面为你详细介绍如何使用Python中的gensim库构建LDA&#xff08;Latent Dirichlet Allocation&#xff09;模型来分析收集到的评论。LDA是一种主题模型&#xff0c;它可以将文档集合中的文本按照主题进行分类。 步骤概述 数据预处理&#xff1a;对收集到的评论进行清洗、分词…...

23种设计模式 - 策略模式

模式定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列可互换的算法&#xff0c;并将每个算法封装成独立类&#xff0c;使得算法可以独立于客户端变化。该模式的核心思想是解耦算法的定义与使用&#xff0c;适用于需要动…...

Cursor 与团队协作:提升团队开发效率

引言 在团队开发中&#xff0c;代码质量参差不齐、重复错误频发、代码审查耗时过长是制约效率的三大痛点。据 GitHub 调查&#xff0c;开发者平均每周花费 4.3 小时修复他人代码问题&#xff0c;而 60% 的合并请求&#xff08;PR&#xff09;因风格或低级错误被驳回。Cursor 作…...

QT qbytearray转qString

qbytearray转qString 在Qt框架中&#xff0c;QByteArray和QString是常用的数据类型&#xff0c;它们用于处理不同类型的字符串数据。QByteArray用于存储原始字节数据&#xff0c;而QString用于存储Unicode字符串。在某些情况下&#xff0c;你可能需要将QByteArray转换为QStrin…...

激光工控机在自动化生产线中有什么关键作用?

激光工控机作为自动化生产线的核心设备&#xff0c;通过高精度控制、快速响应和智能化集成&#xff0c;在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析&#xff1a; 一、实现高效连续生产&#xff1a; 1.高速加工能力&#xff1…...

深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)

HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议&#xff0c;使用TCP作为传输层协议&#xff0c;默认端口是80&#xff0c;基于请求和响应的方式&#xff0c;即客户端发起请求&#xff0c;服务器响应请求并返回数据&#xff08;HTML&#xff0c;JSON&#xff09;。在H…...

Kubernetes的Ingress和Service有什么区别?

在Kubernetes中&#xff0c;Ingress和Service是两个不同的概念&#xff0c;它们在功能、作用范围、应用场景等方面存在明显区别&#xff0c;具体如下&#xff1a; 功能 Ingress&#xff1a;主要用于管理集群外部到内部服务的HTTP和HTTPS流量路由。它可以根据域名、路径等规则…...

WordPress“更新失败,响应不是有效的JSON响应”问题的修复

在使用WordPress搭建网站时&#xff0c;许多人在编辑或更新文章时&#xff0c;可能会遇到一个提示框&#xff0c;显示“更新失败&#xff0c;响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说&#xff0c;太难懂。其实&#xff0c;这个问题并不复杂&#x…...

【回溯算法2】

力扣17.电话号码的字母组合 链接: link 思路 这道题容易想到用嵌套的for循环实现&#xff0c;但是如果输入的数字变多&#xff0c;嵌套的for循环也会变长&#xff0c;所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应&#xff0c;这样就可以获得数字字母的映射了…...

【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?

在分布式系统中&#xff0c;RabbitMQ 自身不直接提供消息幂等性保障机制&#xff0c;但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践&#xff1a; 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一ID&#xff…...

layui 远程搜索下拉选择组件(多选)

模板使用&#xff08;lay-module/searchSelect&#xff09;&#xff0c;依赖于 jquery、layui.dist 中的 dropdown 模块实现&#xff08;所以data 格式请参照 layui文档&#xff09; <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…...

【开源】思维导图:思绪思维导图 (Simple Mind Map)

目录 1. 思绪思维导图 2. 本地使用 3. 在线网页 1. 思绪思维导图 思绪思维导图&#xff0c;英文名称为Simple mind map&#xff0c;简称为SSM。 开源、免费 GitHub网址 支持多平台&#xff1a;Windows&#xff0c;Mac和Linux 支持在线和离线使用 2. 本地使用 安装包下载地址…...

国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!

1 文件操作 2 应用场景 在文件编辑过程中&#xff0c;有时需要对文件进行一些操作&#xff0c;比如&#xff1a;在命令窗口输入文件路径、文件名&#xff0c;进入到文件目录&#xff0c;对文件进行压缩等&#xff0c;如果没有直达命令&#xff0c;用户需要通过文件管理器找到目…...

STM32MP157A单片机移植Linux驱动

在stm32mp157a单片机移植Linux操作系统&#xff0c;并移植内核驱动&#xff0c;在应用程序中使用3个线程&#xff0c;分别实现控制单片机上3个led流水灯的功能、蜂鸣器控制的功能、风扇控制的功能。 需求整理&#xff1a; 1.驱动程序-->led1.c&#xff0c;led2.c&#xff…...

UE引擎游戏加固方案解析

据VGinsights的报告&#xff0c;近年来UE引擎在过去几年中市场占比显著增长&#xff0c;其中亚洲市场增幅达到了30%&#xff0c;随着UE5的推出和技术的不断进步&#xff0c;UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...

[kubelet-check] It seems like the kubelet isn‘t running or healthy.

执行k8s时报错&#xff1a; [kubelet-check] It seems like the kubelet isn’t running or healthy. [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with error: Get "http://localhost:10248/heal ** 解决办法如下&a…...

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll&#xff0c;同时定义了一些结构体来配合这些 API 函数的使用&#xff0c;常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大&#xff0c;抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…...