
我第一次在台湾部署WebSocket长连接服务,是为了一家本地金融科技客户做的股票实时行情推送系统。对方要求低延迟、高并发、稳定性强,而所有服务节点必须落地台湾,满足合规要求。过去我大多在 AWS、阿里云、Azure 这些全球节点环境里部署服务,而这次,面对本地 IDC 服务商和独立服务器的环境,我遇到了不少问题:网络 MTU 不一致、内核参数默认不合理、TCP 连接上限受限……最后靠着多次调优和测试,总算跑通了稳定的 WebSocket 服务。
今天这篇文章,我就以第一人称的视角,完整还原我部署 WebSocket 服务的过程,分享那些必须关注的系统参数、部署细节和优化方法,尤其是在台湾本地服务器环境下。
一、选择合适的台湾服务器产品
物理机 vs 虚拟机:长连接优先物理机
WebSocket 是一种典型的“连接数多、数据量小但实时性强”的场景,因此我优先考虑物理服务器而非 VPS(虚拟专用服务器),避免虚拟化资源调度对网络延迟的影响。经过对比,我选择了台湾中华电信 HiNet 的租用物理服务器服务。
机型选择:
- CPU:Intel Xeon E-2276G(6 核 12 线程)
- 内存:32GB DDR4
- 硬盘:1TB NVMe SSD
- 网络带宽:独享 500Mbps 出口,公网 IP
操作系统版本
我部署在 Ubuntu Server 22.04 LTS,因为它对系统参数调整更灵活,社区文档也丰富。CentOS 虽稳定但更新较慢,对 WebSocket 服务这种需要灵活调优的场景而言,Ubuntu 更合适。
二、部署前必须调整的系统参数
WebSocket 长连接服务的核心问题在于“如何支撑足够多的并发连接”,所以 TCP 参数、文件描述符限制、内核队列长度等都必须做相应调整。
2.1 最大文件描述符限制
默认情况下,Linux 用户最多只能打开 1024 个文件,这远不能满足高并发 WebSocket 的需求。
我做了如下配置:
# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
并在 systemd 启动服务文件中加上:
[Service]
LimitNOFILE=1048576
这一步允许我们支撑上百万级的连接数量(每个连接一个 fd)。
2.2 内核 TCP 参数调整
使用 sysctl 调整 TCP 栈参数:
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5
这些参数提高了监听队列长度,调整了 TIME_WAIT 和 keep-alive 策略,有效提高了连接处理效率。
2.3 禁用 Nagle 算法(可选)
WebSocket 服务通常数据包小且实时性要求高,因此我在服务端使用了 TCP_NODELAY:
// Node.js 示例
socket.setNoDelay(true);
三、部署服务端 WebSocket 应用
我使用的是 Node.js + ws 模块,这是目前生产环境里一个非常成熟的 WebSocket 服务器框架。
npm install ws
核心代码如下:
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => {
ws.on('message', (msg) => {
console.log('Received:', msg);
// Echo back
ws.send(`Echo: ${msg}`);
});
});
为了支持集群和多核,我使用了 cluster 模块结合 Nginx:
sudo apt install nginx
并在 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";
}
四、性能与压力测试
为了验证系统能支撑多少连接,我使用了 websocat 和 wrk 工具。
4.1 并发连接测试
websocat -n 10000 ws://your-server-ip:8080
在调整完系统参数后,我成功在单台服务器上支撑了5 万个活跃 WebSocket 连接,CPU 占用维持在 30% 以下,内存占用约 12GB。
4.2 吞吐量与延迟测试
使用 wrk 自定义 Lua 脚本模拟 WebSocket 消息:
wrk -t8 -c1000 -d30s -s ws.lua http://localhost:8080
结果表明:
- 平均响应延迟: < 20ms
- 吞吐能力: 每秒 1.2 万条消息稳定处理
五、数据支撑与监控配置
为了保障服务稳定运行,我配置了如下监控系统:
- Prometheus + Grafana:采集 CPU、内存、连接数、I/O 等指标
- Netdata:实时图形化查看系统负载
- Node.js 内部指标暴露:连接数、活跃连接、每秒推送量
setInterval(() => {
console.log(`Active connections: ${server.clients.size}`);
}, 5000);
六、A5IDC的建议
从这次部署 WebSocket 服务在台湾服务器的经验来看,成功的关键在于:
- 选择高质量IDC机房和物理机,保证网络和硬件性能。
- 提前优化操作系统参数,特别是文件句柄数和 TCP 栈设置。
- 构建稳定的 WebSocket 应用逻辑,结合 Nginx 处理高并发。
- 配置详尽的监控体系,实时掌握系统状态。
台湾本地部署虽然存在带宽出口小、数据中心不统一等问题,但只要做足准备,是完全可以承载高并发 WebSocket 服务的。











