4.WebSocket 配置与Nginx 的完美结合
序言
在现代 web 应用中,WebSocket 作为一种全双工通信协议,为实时数据传输提供了强大的支持。若要确保 WebSocket 在生产环境中的稳定性和性能,使用 Nginx 作为反向代理服务器是一个明智的选择。本篇文章将带你了解如何在 Nginx 中配置 WebSocket,并验证其是否正常工作。
1. Nginx 中的 WebSocket 配置
1.1 安装 Nginx
在进行配置之前,确保你的系统上已安装 Nginx。你可以使用以下命令来安装:
- Ubuntu/Debian:
sudo apt update
sudo apt install nginx
- CentOS/RHEL:
sudo yum install nginx
1.2 基本 Nginx 配置
打开 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default)并添加以下内容,以支持 WebSocket 连接。
server {listen 80;server_name yourdomain.com; # 替换为你的域名location /ws { # WebSocket 路径proxy_pass http://localhost:8080; # 你的 WebSocket 服务器地址proxy_http_version 1.1; # 确保使用 HTTP/1.1proxy_set_header Upgrade $http_upgrade; # 必须的配置proxy_set_header Connection "Upgrade"; # 必须的配置proxy_set_header Host $host; # 保留主机头部proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发 IPproxy_set_header X-Forwarded-Proto $scheme; # 转发协议}location / { # 其他请求proxy_pass http://localhost:8080; # 可以根据实际情况修改}
}
1.3 重启 Nginx
配置完成后,需要重启 Nginx 以应用更改:
sudo systemctl restart nginx
或者
nginx - s reload
2. 验证 WebSocket 配置的正确性
确保 WebSocket 正常工作的方式有很多,以下是几种简单有效的方法:
2.1 使用浏览器的开发者工具
- 打开你的网页应用并使用浏览器的开发者工具(通常按 F12)。
- 切换到 Network 标签。
- 刷新页面,并查看 WebSocket 连接。
- 查找以 ws:// 或 wss:// 开头的请求,确认其状态为 101 Switching Protocols。这表示 WebSocket 连接已成功建立。
2.2 使用 wscat 测试工具
wscat 是一个非常实用的命令行工具,可以帮助你测试 WebSocket 连接。你可以通过 npm 安装:
npm install -g wscat
然后使用以下命令连接到 WebSocket 服务器:
wscat -c ws://yourdomain.com/ws
输入一些消息并确认能正常发送和接收。如果一切正常,说明 WebSocket 配置成功。
2.3 编写简单的客户端代码
你可以使用以下 JavaScript 代码在客户端验证 WebSocket 是否正常工作:
const ws = new WebSocket('ws://yourdomain.com/ws');ws.onopen = () => {console.log('Connected to the WebSocket server!');ws.send('Hello, server!'); // 发送测试消息
};ws.onmessage = (event) => {console.log('Received message from server:', event.data);
};ws.onclose = () => {console.log('Disconnected from WebSocket server.');
};ws.onerror = (error) => {console.error('WebSocket error:', error);
};
3. 常见问题及解决方法
3.1 WebSocket 连接状态为 404 或 403
- 原因:此错误通常表明 WebSocket 请求的路径不正确,或者 Nginx 配置中的 location 块未能正确匹配 WebSocket 请求。
- 解决方法:
- 确保 WebSocket 的 URL 与 Nginx 配置中的路径一致。例如,如果在 Nginx 中配置的是 /ws,确保你的 WebSocket 客户端也使用 ws://yourdomain.com/ws。
- 示例:如果客户端使用 ws://yourdomain.com/socket 而服务器在 /ws 下监听,会导致 404 错误。
3.2 浏览器控制台显示“Connection Refused”
-
原因:这种情况通常表明 WebSocket 服务器未在指定的地址和端口上运行,或者 Nginx 没有正确地将请求转发到 WebSocket 服务器。
-
解决方法:
-
确认 WebSocket 服务器是否正在运行,使用如下命令检查端口:
netstat -tuln | grep 8080 -
确保 Nginx 配置中的 proxy_pass 地址与 WebSocket 服务器的地址匹配。
-
3.3 收到的消息为空或格式不正确
-
原因:这可能是由于服务器未能正确解析发送的消息,或未能以预期格式发送消息。
-
解决方法:
- 检查服务器代码以确保正确接收和处理消息。例如,在 Node.js 的 WebSocket 服务器中,可以使用以下代码确保将消息以字符串格式发送:
ws.on('message', (message) => {const response = JSON.stringify({ message: message });clients.forEach(client => client.send(response)); });- 在客户端确认处理消息的代码逻辑是否正确,例如:
ws.onmessage = (event) => {const data = JSON.parse(event.data);console.log('Received message:', data.message); };
3.4 连接经常断开
-
原因**:可能是由于服务器的资源(如 CPU、内存)不足,或者 Nginx 的超时设置过低。
-
解决方法:
-
检查服务器的资源使用情况,确保能处理所有 WebSocket 连接。
-
在 Nginx 配置中增加 proxy_read_timeout 和 proxy_send_timeout 的值,例如:
location /ws {proxy_read_timeout 86400; # 24 小时proxy_send_timeout 86400;... } -
监控 WebSocket 连接的状态,以发现是否有客户端异常断开。
-
3.5 使用 SSL(wss://)时出现证书错误
-
原因:SSL 证书未正确配置,或者证书与请求的域名不匹配。
-
解决方法:
-
确保在 Nginx 配置中正确加载了 SSL 证书和私钥:
server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;... } -
使用 Let’s Encrypt 获取有效的 SSL 证书并确保证书与访问的域名一致。可以使用 certbot 工具自动化这一过程。
-
3.6 在负载均衡环境中,WebSocket 连接断开
-
原因:如果 Nginx 配置了负载均衡而没有保持会话(Sticky Sessions),可能导致 WebSocket 连接在请求转发时断开。
-
解决方法:
-
在 Nginx 配置中使用 ip_hash 来确保同一客户端总是连接到同一后端服务器:
upstream websocket {ip_hash;server backend1:8080;server backend2:8080; }server {location /ws {proxy_pass http://websocket;...} }
-
相关文章:
4.WebSocket 配置与Nginx 的完美结合
序言 在现代 web 应用中,WebSocket 作为一种全双工通信协议,为实时数据传输提供了强大的支持。若要确保 WebSocket 在生产环境中的稳定性和性能,使用 Nginx 作为反向代理服务器是一个明智的选择。本篇文章将带你了解如何在 Nginx 中配置 Web…...
Docker:镜像构建 DockerFile
Docker:镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富…...
浮动路由:实现出口线路的负载均衡冗余备份。
浮动路由 Tip:浮动路由指在多条默认路由基础上加入优先级参数,实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数:越小越优 本次实验测试两条默认路由,其中一条默认路由添加优先级参数,设置…...
二叉树的遍历和线索二叉树
二叉树遍历 二叉树结点的定义 typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild; }BiNode, *BiTree; 先序 递归算法 void PreOrder1(BiTree T){if(T!NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);} } 非递归算法(栈实现…...
SpringBoot3 集成Junit4
目录 1. 确保项目中包含JUnit 4依赖添加JUnit 4依赖 2. 配置Spring Boot使用JUnit 4在测试类中使用RunWith注解 3. 编写测试代码4、总结 【扩展】RunWith(SpringRunner.class) 中SpringRunner的作用1. **加载 Spring 应用上下文(ApplicationContext)**2.…...
Scala的set的添加删减和查询
添加:最好用于不可变数组,因为它会产生新数组,而不是在原数组上进行修改。 在尾部添加元素 可变数组 删减:按元素值删除元素 - 查询:查询元素是否存在.contains package Test //Set //特点:元素是唯…...
基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)
摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…...
【spark面试题】RDD和DataFrame以及DataSet有什么异同
RDD(Resilient Distributed Dataset): 概念:可理解为分布式的列表。它的每个元素代表数据的一行,具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据,具有很强的灵活性。例如&#…...
[Python]关于Tensorflow+Keras+h5py+numpy一些骚操作备忘
起因:要在Anaconda使用Tensorflow和Keras框架 这里提前小结一下: 1,一定要注意Python、Tensorflow、Keras不同版本的对应关系。 2,交叉用conda install 和pip install安装依赖库可能容易出现问题,在Anaconda虚拟环境…...
深度学习:Transformer 详解
Transformer 详解 对于Transformer模型的详细解释,可以更深入地探讨其各个组成部分、工作原理、以及在自然语言处理任务中的应用方法。以下是对Transformer模型的一个更全面和详细的解释,包括其架构细节和关键技术: 1. 基本架构 Transform…...
jmeter 性能测试步骤是什么?
JMeter是一款流行的开源性能测试工具,用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时,通常需要遵循以下步骤: 确定测试目标:首先,明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…...
前端入门一之JS最基础、最基础语法
前言 JS是前端三件套之一,也是核心,本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点;这篇文章是本人大一学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。 文章目录 初体验输入输出语句变量和常量常量变量…...
解决Swp交换空间被占满问题
解决ubuntu交换空间被占满问题 step1: cat /proc/sys/vm/swappiness 60 step2: sudo sysctl vm.swappiness10 #临时修改 step3: sudo sh -c “echo “vm.swappiness10” >> /etc/sysctl.conf” step4: sysctl -p #生效...
草地景观中的土地覆被变化:将增强型大地遥感卫星数据组成、LandTrendr 和谷歌地球引擎中的机器学习分类与 MLP-ANN 场景预测相结合
目录 简介 方法 结论 代码1:影像集合 代码2: 随机森林和svm分类 结果 简介 了解草原生境在空间和时间上的动态对于评估保护措施的有效性和制定可持续管理方法至关重要,特别是在自然 2000 网络和欧洲生物多样性战略范围内。 根据遥感数据绘制的土地覆盖图对于了解植被…...
【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
字符串常量是用一对双引号括起来的字符序列,例如,"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是,按串中字符的排列次序顺序存放,每个字符占1字节,并在末…...
《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)
《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1) 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…...
深入解析gdb -p 与gdb attach 的区别与使用场景
摘要:本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点,帮助读者更好地理解并运用这两个调试工具。 一、引言 在Linux系统中,GDB(GNU Debugger)是一款功能强大的调试工具,广泛应用…...
C语言 | Leetcode C语言题解之第542题01矩阵
题目: 题解: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…...
论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution
论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…...
前端介绍|基础入门-html+css+js
文章目录 本课程有什么?前端是什么?1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么? 本套课程是零基础入门保姆级课程,课程主要内容包含: HTML…...
GIL Free ≠ Thread Safe:从Linux futex源码到Python对象头重定义,解构无锁环境下的引用计数崩溃根因(含gdb逆向调试录屏脚本)
第一章:GIL Free ≠ Thread Safe:核心命题与崩溃现象全景Python 的全局解释器锁(GIL)长期被视为多线程性能的桎梏,而 PyPy、Jython 乃至最新 CPython 3.13 的实验性 GIL-free 构建,常被误读为“天然支持安全…...
ComfyUI DWPose预处理器GPU加速终极指南:三步解决ONNX运行时故障
ComfyUI DWPose预处理器GPU加速终极指南:三步解决ONNX运行时故障 【免费下载链接】comfyui_controlnet_aux 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 在ComfyUI生态系统中,DWPose预处理器作为姿态估计的核心组件&am…...
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南
3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 一、为什么你需要专业的资源嗅探工具? 场景化痛点直击 作为…...
TeslaMate终极指南:如何打造专属的特斯拉数据分析平台
TeslaMate终极指南:如何打造专属的特斯拉数据分析平台 【免费下载链接】teslamate teslamate-org/teslamate: TeslaMate 是一个开源项目,用于收集特斯拉电动汽车的实时数据,并存储在数据库中以便进一步分析和可视化。该项目支持监控车辆状态、…...
WarcraftHelper:魔兽争霸3现代优化解决方案 - 突破兼容性壁垒,重焕经典游戏活力
WarcraftHelper:魔兽争霸3现代优化解决方案 - 突破兼容性壁垒,重焕经典游戏活力 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper …...
Shopee风控算法逆向 - Unidbg补环境实战解析
1. Shopee风控算法逆向分析入门 最近在研究Shopee的风控机制时,我发现他们的Native层加密算法特别有意思。作为一个常年和移动安全打交道的开发者,今天想和大家分享下使用Unidbg模拟执行Shopee风控算法的完整过程。 Shopee作为东南亚头部电商平台&…...
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘 背单词时总是前脚记后脚忘?这其实不是记忆力的问题,而是方法的问题。我们的大脑就像一台精密的生物计算机,而记忆的形成和巩固遵循着特定的神经科学规律。理解这些规…...
Qwen2.5-VL视觉定位模型优化升级:GPU加速、批量处理、提示词技巧
Qwen2.5-VL视觉定位模型优化升级:GPU加速、批量处理、提示词技巧 1. 视觉定位技术概述 视觉定位(Visual Grounding)是计算机视觉领域的一项关键技术,它能够根据自然语言描述在图像中精确定位目标对象。这项技术在智能相册管理、…...
告别黑盒:用DrugBAN的可视化注意力,手把手教你解读AI预测的药物结合位点
从热力图到生物学洞察:DrugBAN注意力机制在药物发现中的实战指南 当AI模型预测出某种小分子可能与靶点蛋白结合时,药物研发者最迫切的问题是:模型究竟看到了什么?传统"黑盒"模型只能给出冷冰冰的预测分数,而…...
可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据
下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5665字)。 2篇2章6节:R的多重填补法中随机回归填补法的应用,MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中,缺失数据是常见且具有挑战性…...
