如何在 CN2 VPS 上配置 WebSocket 实现实时消息推送?

文章导读
在 CN2 VPS 上配置 WebSocket 实现实时消息推送,建议采用 SpringBoot 结合 Nginx 反向代理方案,并强制启用 WSS 加密。该方案适用于在线聊天、实时监控等对延迟敏感场景,需注意调整系统文件描述符以支持高并发连接。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 CN2 VPS 上配置 WebSocket 实现实时消息推送,建议采用 SpringBoot 结合 Nginx 反向代理方案,并强制启用 WSS 加密。该方案适用于在线聊天、实时监控等对延迟敏感场景,需注意调整系统文件描述符以支持高并发连接。

先说结论:CN2 线路优化了路由路径,配合 WebSocket 全双工协议可显著降低通信延迟,但必须配置 WSS 保障传输安全。

  • 适合:在线聊天、系统通知、实时数据展示等需要服务端主动推送的场景。
  • 先准备:确认 VPS 支持 CN2 线路,调整 Linux 文件描述符限制(ulimit)及 TCP 栈参数。
  • 验收:通过浏览器控制台查看 WebSocket 连接状态,验证消息延迟及断线重连机制。

命令速用版

以下为核心配置片段,可直接用于 SpringBoot 项目初始化及 Nginx 反向代理设置。

1. SpringBoot 依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2. Nginx 反向代理配置(支持 WebSocket 升级)

location /ws/ {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

3. 系统连接数优化(/etc/sysctl.conf)

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

为什么会这样

WebSocket 协议建立的是全双工持久连接,服务器可主动向客户端推送数据,无需等待客户端请求。在 VPS 云环境中部署时,这种特性显著降低了服务器负载,同时提高了消息传递的实时性。部分测试数据显示,WebSocket 连接建立后,消息延迟可控制在 50ms 以内,这对于金融交易、在线协作等对时效性要求极高的场景至关重要。CN2 线路通过 BGP 多线接入智能选择最优路由路径,进一步将 TCP 握手延迟控制在较低水平,适合需要频繁进行数据推送的应用场景。

分步处理

第一步:引入依赖与配置类

在 SpringBoot 项目中引入 websocket starter 依赖,并创建配置类注册 ServerEndpointExporter Bean,用于检测注解@ServerEndpoint 的 bean 并注册它们。

第二步:实现 WebSocket 服务端

使用@ServerEndpoint 注解定义路径,利用 ConcurrentHashMap 存放每个用户的 WebSocket 连接 Session。实现@OnOpen、@OnClose、@OnMessage 方法分别处理连接建立、关闭及消息接收逻辑。

若使用 Nginx 作为前置服务器,需配置 proxy_set_header Upgrade 和 Connection 参数,确保 HTTP 协议能正确升级为 WebSocket 协议,否则连接会降级为普通 HTTP 请求导致推送失败。

第四步:启用 WSS 加密

必须实施 WSS(WebSocket Secure) 协议,即在 TLS/SSL 加密层上运行 WebSocket,防止数据在传输过程中被窃听或篡改。在 VPS 云环境中,还需要配置适当的防火墙规则,仅开放必要的端口。

怎么验证是否生效

1. 检查连接状态

如何在 CN2 VPS 上配置 WebSocket 实现实时消息推送?

在浏览器控制台使用 JavaScript WebSocket API 发起连接,观察 console 日志是否输出“连接已建立”。若 readyState 属性返回 1 (OPEN),表示连接成功。

2. 查看服务端日志

检查 SpringBoot 应用日志,确认是否打印“用户已连接”及“当前在线人数”信息。若有错误,日志会记录 WebSocket 错误堆栈。

3. 测试消息延迟

发送测试消息并记录时间戳,对比客户端接收时间与发送时间。公开资料中没有看到可靠的量化数据表明所有 CN2 VPS 都能达到特定延迟值,但可观察是否在可接受范围内。

常见坑

1. 防火墙拦截

云服务器安全组未开放 WebSocket 使用的端口(通常为 443 或自定义高端口),导致连接超时。需在云服务商控制台放行相应 TCP 端口。

2. 缺少心跳机制

WebSocket 协议本身不包含心跳机制,长时间无数据交互可能被中间网络设备断开。建议实现应用层的心跳包检测,及时断开异常连接释放资源。

3. 文件描述符限制

Linux 系统默认文件描述符限制较低,高并发下会报错“Too many open files”。需修改 ulimit 配置及/etc/sysctl.conf 中的网络参数以提升连接处理能力。

常见问题

WebSocket 和 HTTP 轮询有什么区别?

HTTP 轮询需要客户端频繁发起请求,实时性差且消耗带宽;WebSocket 建立连接后保持双向通信,服务端可即时推送,延迟更低。

为什么必须使用 WSS 而不是 WS?

WS 是明文传输,数据容易被窃听或篡改;WSS 基于 TLS/SSL 加密,能保障数据传输安全,且更容易通过防火墙和代理服务器。

一台 VPS 能支持多少 WebSocket 连接?

取决于服务器配置及系统参数优化。配置得当的 VPS 云服务器可以轻松支持上万级别的 WebSocket 连接,但需调整文件描述符限制和 TCP 栈参数。

参考来源

  • SpringBoot + WebSocket 实现实时消息推送 (在线聊天/通知)-CSDN 博客
  • WebSocket 实时通信与消息推送实现方法
  • WebSocket 实时 VPS 云通知系统实现
  • websocket 步骤 消息推送_WebSocket 实时消息推送
  • WebSocket 服务及实时消息推送实现
  • 使用 Websocket 通信协议实现实时消息推送
  • websocket 步骤 消息推送_SpringBoot 集成 WebSocket,实现后端消息数据实时推送-CSDN 博客
  • 实现基于 WebSocket 的实时消息推送
  • WebSocket 实时通信香港 VPS 指南
  • 如何在 PHP 中使用 WebSocket API 进行实时消息推送