【详解】Nginx配置WebSocket

目录

Nginx配置WebSocket

简介

准备工作

检查 Nginx 版本

配置 Nginx 支持 WebSocket

修改 Nginx 配置文件

解释配置项

测试配置

测试 WebSocket 连接

WebSocket 服务端 (Node.js)

WebSocket 客户端 (HTML + JavaScript)

运行测试

Nginx 配置文件示例

解释

测试配置

1. 确保Nginx版本支持WebSocket

2. 安装Nginx(如果尚未安装)

3. 配置Nginx支持WebSocket

4. 解释配置

5. 测试配置

6. 验证WebSocket连接


Nginx配置WebSocket

简介

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

Nginx 作为高性能的 HTTP 和反向代理服务器,在处理 WebSocket 协议时,需要进行特定的配置来支持 WebSocket 的连接和通信。本文将详细介绍如何在 Nginx 中配置 WebSocket。

准备工作

在开始配置之前,请确保您的环境中已经安装了 Nginx,并且 Nginx 版本至少为 1.3.13,因为这是 Nginx 开始支持 WebSocket 协议的版本。

检查 Nginx 版本
nginx -v

如果版本低于 1.3.13,您需要更新或重新编译 Nginx 以包含 WebSocket 支持。

配置 Nginx 支持 WebSocket

修改 Nginx 配置文件

打开您的 Nginx 配置文件,通常位于 ​​/etc/nginx/nginx.conf​​ 或 ​​/etc/nginx/conf.d/​​ 目录下。找到您想要配置 WebSocket 的 server 块,添加以下配置:

server {listen 80;server_name your_domain.com;location /ws/ {proxy_pass http://backend_server;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}
}
解释配置项
  • ​proxy_pass http://backend_server;​​:指定后端 WebSocket 服务的地址。
  • ​proxy_http_version 1.1;​​:设置代理使用的 HTTP 版本为 1.1,这是 WebSocket 所必需的。
  • ​proxy_set_header Upgrade $http_upgrade;​​:传递 Upgrade 头信息给后端服务器,这告诉服务器客户端希望升级到 WebSocket 协议。
  • ​proxy_set_header Connection "upgrade";​​:传递 Connection 头信息,用于控制或指定当前连接或消息体的性质。
  • ​proxy_set_header Host $host;​​:传递原始请求中的主机头信息给后端服务器。
测试配置

修改完配置文件后,先测试配置是否正确:

nginx -t

如果没有错误,重启 Nginx 使配置生效:

sudo systemctl restart nginx

或者

sudo service nginx restart

测试 WebSocket 连接

为了验证 Nginx 是否成功配置了 WebSocket,您可以编写一个简单的 WebSocket 客户端和服务端来进行测试。这里提供一个基本的示例:

WebSocket 服务端 (Node.js)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', ws => {console.log('Client connected');ws.on('message', message => {console.log('Received:', message);ws.send(`Echo: ${message}`);});
});
WebSocket 客户端 (HTML + JavaScript)
<!DOCTYPE html>
<html>
<head><title>WebSocket Test</title>
</head>
<body><script>const socket = new WebSocket('ws://your_domain.com/ws/');socket.onopen = () => {console.log('Connected to the WebSocket server.');socket.send('Hello Server!');};socket.onmessage = event => {console.log('Message from server:', event.data);};socket.onclose = () => {console.log('Disconnected from the WebSocket server.');};</script>
</body>
</html>
运行测试
  1. 启动 WebSocket 服务端。
  2. 打开浏览器,访问包含 WebSocket 客户端代码的 HTML 页面。
  3. 查看浏览器的开发者工具中的控制台输出,确认与 WebSocket 服务端的连接和消息收发是否正常。

如果您遇到任何问题,建议检查 Nginx 日志和 WebSocket 服务端的日志,以便快速定位问题。在许多现代Web应用中,WebSocket被广泛用于实现实时通信,例如在线聊天、实时数据更新等。Nginx 作为高性能的HTTP和反向代理服务器,可以通过配置支持WebSocket协议,从而为这些应用提供支持。

以下是一个Nginx配置文件的示例,该配置文件展示了如何设置Nginx以支持WebSocket连接:

Nginx 配置文件示例
# 定义一个http块
http {# 设置日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;error_log /var/log/nginx/error.log;# 包含其他配置文件include       /etc/nginx/mime.types;default_type  application/octet-stream;# 设置发送文件的最大大小client_max_body_size 10M;# 定义一个server块server {listen 80;  # 监听80端口server_name example.com;  # 你的域名# 配置静态文件目录location / {root /usr/share/nginx/html;index index.html index.htm;}# 配置WebSocket代理location /ws/ {proxy_pass http://localhost:3000;  # 后端WebSocket服务地址proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-NginX-Proxy true;# 超时时间(单位:秒)proxy_read_timeout 86400s;proxy_send_timeout 86400s;}}
}
解释
  1. listen 80;:这行指定了Nginx监听80端口。
  2. server_name ​​example.com​​;:指定服务器的域名。
  3. location / { ... }:这部分配置了静态文件的处理方式。
  4. location /ws/ { ... }:这部分是关键,配置了WebSocket的代理:
  • proxy_pass http://localhost:3000;:将请求转发到后端的WebSocket服务。这里的​​localhost:3000​​应该替换为你实际的WebSocket服务地址。
  • proxy_http_version 1.1;:设置HTTP版本为1.1,因为WebSocket需要使用HTTP 1.1。
  • proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";:这两行是关键,告诉Nginx这是一个WebSocket连接。
  • proxy_set_header Host $host; 等:设置一些必要的头部信息,帮助后端服务正确处理请求。
  • proxy_read_timeout 86400s;proxy_send_timeout 86400s;:设置读写超时时间为24小时,确保长时间连接不会被Nginx中断。
测试配置

在修改完Nginx配置文件后,可以使用以下命令测试配置是否正确:

sudo nginx -t

如果测试通过,可以重新加载Nginx以应用新的配置:

sudo systemctl reload nginx

这样,Nginx就配置好了对WebSocket的支持。希望这个示例对你有帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。当然可以!在Nginx中配置WebSocket支持可以让Nginx作为反向代理服务器,将WebSocket请求转发到后端的WebSocket服务。以下是一个详细的步骤和示例配置,帮助你在Nginx中配置WebSocket。

1. 确保Nginx版本支持WebSocket

首先,确保你的Nginx版本支持WebSocket。从Nginx 1.3.13版本开始,Nginx就已经支持WebSocket协议。你可以通过以下命令检查Nginx版本:

nginx -v
2. 安装Nginx(如果尚未安装)

如果你还没有安装Nginx,可以通过以下命令进行安装(以Ubuntu为例):

sudo apt update
sudo apt install nginx
3. 配置Nginx支持WebSocket

编辑Nginx的配置文件,通常位于​​/etc/nginx/nginx.conf​​或​​/etc/nginx/sites-available/default​​。你可以在​​server​​块中添加WebSocket相关的配置。

以下是一个示例配置:

http {# 其他HTTP配置upstream websocket_backend {server 127.0.0.1:8080;  # WebSocket服务的地址和端口}server {listen 80;server_name your_domain.com;location /ws/ {proxy_pass http://websocket_backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;# 可选:设置超时时间proxy_read_timeout 86400s;proxy_send_timeout 86400s;}# 其他location配置location / {# 例如,静态文件服务root /var/www/html;index index.html index.htm;}}
}
4. 解释配置
  • ​upstream websocket_backend​​: 定义一个后端WebSocket服务的集群。这里假设WebSocket服务运行在​​127.0.0.1:8080​​。
  • ​listen 80;​​: 监听80端口。
  • ​server_name your_domain.com;​​: 指定服务器名称,替换为你的实际域名。
  • ​location /ws/​​: 定义处理WebSocket请求的路径。
  • ​proxy_pass http://websocket_backend;​​: 将请求转发到定义的后端WebSocket服务。
  • ​proxy_http_version 1.1;​​: 使用HTTP/1.1版本,因为WebSocket协议基于HTTP/1.1。
  • ​proxy_set_header Upgrade $http_upgrade;​​: 设置​​Upgrade​​头,告诉后端这是一个WebSocket升级请求。
  • ​proxy_set_header Connection "upgrade";​​: 设置​​Connection​​头,告诉后端连接需要升级。
  • ​proxy_set_header Host $host;​​: 设置​​Host​​头,传递客户端请求的主机名。
  • ​proxy_read_timeout 86400s;​​ 和 ​​proxy_send_timeout 86400s;​​: 设置读取和发送超时时间为24小时,防止连接因长时间无数据传输而被关闭。
5. 测试配置

保存配置文件后,测试Nginx配置是否正确:

sudo nginx -t

如果没有错误,重新加载Nginx以应用新的配置:

sudo systemctl reload nginx
6. 验证WebSocket连接

你可以使用浏览器或其他工具(如​​wscat​​)来验证WebSocket连接是否正常工作。例如,使用​​wscat​​:

npm install -g wscat
wscat -c ws://your_domain.com/ws/

如果连接成功,说明Nginx已经正确配置了WebSocket支持。

希望这些信息对你有帮助!如果有任何问题,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《轨道力学讲义》——第八讲:行星际轨道设计

第八讲&#xff1a;行星际轨道设计 引言 行星际轨道设计是探索太阳系的核心技术&#xff0c;它涉及如何规划和优化航天器从一个天体到另一个天体的飞行路径。随着人类探索太阳系的雄心不断扩大&#xff0c;从最初的月球探测到火星探测&#xff0c;再到更遥远的外太阳系探测&a…

操作系统学习笔记——[特殊字符]超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白!

&#x1f4a1;超详细 | 如何唤醒被阻塞的 socket 线程&#xff1f;线程阻塞原理、线程池、fork/vfork彻底讲明白&#xff01; 一、什么是阻塞&#xff1f;为什么线程会阻塞&#xff1f;二、socket线程被阻塞的典型场景&#x1f9e0; 解法思路&#xff1a; 三、线程的几种阻塞状…

第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 满分题解

题面链接Htlang/2025lqb_python_b 个人觉得今年这套题整体比往年要简单许多&#xff0c;但是G题想简单了出大问题&#xff0c;预估50101015120860&#xff0c;道阻且长&#xff0c;再接再厉 代码仅供学习参考&#xff0c;满分为赛后洛谷中的测评&#xff0c;蓝桥杯官方测评待…

若依代码生成器原理velocity模板引擎(自用)

1.源码分析 代码生成器:导入表结构(预览、编辑、删除、同步)、生成前后端代码 代码生成器表结构说明&#xff1a; 若依提供了两张核心表来存储导入的业务表信息&#xff1a; gen_table&#xff1a;存储业务表的基本信息 &#xff0c;它对应于配置代码基本信息和生成信息的页…

如何制定有效的风险应对计划

制定有效的风险应对计划的核心在于&#xff1a; 识别潜在风险、评估风险的影响与概率、选择合适的应对策略、建立动态监控和反馈机制。 其中&#xff0c;识别潜在风险是最为关键的第一步。只有准确识别出可能的风险&#xff0c;才能在后续的评估、应对、监控等环节中做到有的放…

A2A协议实现详解及示例

A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议&#xff0c;旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒&#xff0c;实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…

【中级软件设计师】前趋图 (附软考真题)

【中级软件设计师】前趋图 (附软考真题) 目录 【中级软件设计师】前趋图 (附软考真题)一、历年真题三、真题的答案与解析答案解析 复习技巧&#xff1a; 若已掌握【前趋图】相关知识&#xff0c;可直接刷以下真题&#xff1b; 若对知识一知半解&#xff0c;建议略读题目&#x…

调节磁盘和CPU的矛盾——InnoDB的Buffer Pool

缓存的重要性 无论是用于存储用户数据的索引【聚簇索引、二级索引】还是各种系统数据&#xff0c;都是以页的形式存放在表空间中【对一个/几个实际文件的抽象&#xff0c;存储在磁盘上】如果需要访问某页的数据&#xff0c;就会把完整的页数据加载到内存中【即使只访问页中的一…

springboot和springcloud的区别

1. ‌目的与功能‌ ‌1)Spring Boot‌: 主要用于快速构建独立的、生产级的 Spring 应用程序。它通过自动配置和嵌入式服务器等特性,简化了微服务的开发、启动和部署,使开发者能够专注于业务逻辑而非繁琐的配置。‌Spring Boot是一个快速开发的框架,旨在简化Java应用程序的开…

耘想WinNAS:以聊天交互重构NAS生态,开启AI时代的存储革命

一、传统NAS的交互困境与范式瓶颈 在传统NAS&#xff08;网络附加存储&#xff09;领域&#xff0c;用户需通过复杂的图形界面或命令行工具完成文件管理、权限配置、数据检索等操作&#xff0c;学习成本高且效率低下。例如&#xff0c;用户若需搜索特定文件&#xff0c;需手动…

在断网的时候,websocket 一直在CLOSING 状态

现象 websocket 先连接成功&#xff0c;然后断网。 由于维护了一套心跳机制&#xff0c;前端发起心跳&#xff0c;如果一段时间内没有收到服务端返回的心跳。则表示连接断开。 用心跳的方式处理断网的兜底情况。 然而&#xff0c;此时网络是断开的&#xff0c;在代码中直接调…

基于AWS的大模型调用场景:10大成本优化实战方案

大模型训练与推理是AI领域的计算密集型场景&#xff0c;如何在AWS上实现高性能与低成本的双重目标&#xff1f;本文从实例选型、弹性伸缩、存储优化等角度&#xff0c;分享10个经过验证的AWS成本优化策略&#xff0c;帮助企业节省30%以上成本。 一、大模型场景的成本痛点分析 计…

【网络原理】TCP/IP协议五层模型

目录 一. 协议的分层 二. OSI七层网络协议 三. TCP/IP五层网络协议 四. 网络设备所在分层 五. 封装 六. 分用 七. 传输中的封装和分用 八. 数据单位术语 一. 协议的分层 常见的分层为两种OSI七层模型和TCP/IP五层模型 为什么要协议分层&#xff1f; 在网络通信中&…

科技快讯 | 阿里云百炼MCP服务上线;英伟达官宣:CUDA 工具链将全面原生支持 Python

李飞飞团队最新AI报告&#xff1a;中美模型性能差距近乎持平 4月8日&#xff0c;斯坦福大学以人为本人工智能研究所发布《2025年人工智能指数报告》。报告显示&#xff0c;2023年AI性能显著提升&#xff0c;AI应用加速&#xff0c;投资增长&#xff0c;中美AI模型差距缩小。报告…

猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测

✅ 前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠…

2025年燃气证书:传承与发展的行业纽带

回溯历史长河&#xff0c;能源的利用与人类文明的发展息息相关。从远古时期的钻木取火&#xff0c;到如今广泛应用的燃气能源&#xff0c;每一次能源的变革都推动着社会的巨大进步。而在现代燃气行业蓬勃发展的背后&#xff0c;燃气从业人员资格证书正扮演着传承与发展的重要纽…

在Ubuntu下进行单片机开发是否需要关闭Secure Boot

1. Secure Boot的作用 功能&#xff1a;Secure Boot是UEFI的安全功能&#xff0c;旨在阻止未经验证的驱动或操作系统启动&#xff0c;防止恶意软件篡改引导过程。 影响范围&#xff1a;它主要限制的是操作系统启动阶段加载的内核级驱动&#xff08;如显卡驱动、虚拟化模块&…

国达陶瓷重磅推出陶瓷罗马柱外墙整装尖端新产品“冠岩臻石”

近日&#xff0c;记者在佛山国达建材有限公司&#xff08;以下简称国达陶瓷&#xff09;董事长杨建平处了解到&#xff0c;该公司重磅推出的“冠岩臻石”新产品&#xff0c;是属于陶瓷罗马柱外墙整装产品中的尖端产品。新产品自面市之后&#xff0c;深受高端用户的青睐与认可。…

【分享】Ftrans文件摆渡系统:既保障传输安全,又提供强集成支持

【分享】Ftrans文件摆渡系统&#xff1a;既保障传输安全&#xff0c;又提供强集成支持&#xff01; 在数字化浪潮中&#xff0c;企业对数据安全愈发重视&#xff0c;网络隔离成为保护核心数据的关键防线&#xff0c;比如隔离成研发网-办公网、生产网-测试网、内网-外网等。网络…

实验一 字符串匹配实验

一、实验目的 1&#xff0e;熟悉汇编语言编程环境和DEBUG调试程序的使用。 2&#xff0e;掌握键盘输入字符串的方法和分支程序的设计。 二、实验内容 编程实现&#xff1a;从键盘分别输入两个字符串&#xff0c;然后进行比较&#xff0c;若两个字符串的长度…