在 linux 中配置 nginx 的 websocket 专用域名,核心做法是在 server 块中通过 server_name 指定域名,并在对应的 location 块中设置 proxy_pass 指向后端服务,同时必须添加 upgrade 和 connection 头部以支持协议升级。这样做能让 nginx 正确识别并转发 websocket 连接请求,建立全双工通信通道。

Nginx 如何根据 server_name 匹配 WebSocket 请求
当客户端发起 WebSocket 连接时,Nginx 依据 server_name 将请求路由到特定的 server 块。如果配置的域名与请求头中的 Host 匹配,Nginx 就会进入该块的配置逻辑。关键在于,WebSocket 握手阶段是 HTTP 请求,只有当 Nginx 正确解析了 Upgrade 头部并传递给后端,且后端返回 101 状态码后,连接才会升级为 WebSocket。因此,必须在 location 中显式配置代理头部,否则 Nginx 会将其视为普通 HTTP 请求处理,导致连接失败或超时。

server {
listen 80;
server_name ws.example.com;
location /ws/ {
proxy_pass http://backend_server:8080;
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_http_version 1.1 是必须的,因为 WebSocket 协议基于 HTTP/1.1。 proxy_set_header Upgrade $http_upgrade 将客户端的升级请求透传给后端。 proxy_set_header Connection "upgrade" 明确告诉后端需要升级连接。 proxy_cache_bypass 确保缓存不会拦截 WebSocket 握手请求。如果后端服务运行在本地端口 8080,访问 ws.example.com/ws/ 即可建立连接。
WebSocket 专用域名的 SSL/TLS 配置要点
生产环境中,WebSocket 通常通过 WSS(WebSocket Secure)传输,这需要配置 SSL/TLS 证书。在 Nginx 中,为专用域名启用 HTTPS 需要在 server 块中添加 listen 443 ssl 指令,并指定证书和私钥路径。SSL 终止发生在 Nginx 层,Nginx 解密后将明文 WebSocket 请求转发给后端,或者后端也配置 SSL 进行端到端加密。无论哪种方式,Nginx 的配置结构类似,只是增加了 SSL 相关参数。

server {
listen 443 ssl;
server_name wss.example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location /ws/ {
proxy_pass http://backend_server:8080;
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;
}
}此配置中,ssl_certificate 和 ssl_certificate_key 指向实际的证书文件。 ssl_protocols 限制了使用的 TLS 版本,推荐使用 1.2 和 1.3 以保证安全性。其余 location 块内的配置与 HTTP 版本相同。客户端需使用 wss://wss.example.com/ws/ 进行连接。若后端也使用 HTTPS,则 proxy_pass 应改为 https://backend_server:8443,并可能需要配置 proxy_ssl_certificate 等参数以验证后端证书。
WebSocket 连接断开后的重连机制如何处理
在实际应用中,网络波动可能导致 WebSocket 连接意外断开。Nginx 本身不处理重连逻辑,但可以通过配置超时参数来影响连接生命周期。例如,proxy_read_timeout 和 proxy_send_timeout 定义了 Nginx 等待后端响应的最长时间。如果后端长时间无响应,Nginx 会关闭连接。前端应用应实现心跳机制和自动重连策略,以应对这些断开事件。Nginx 的配置可以配合前端逻辑,确保在合理时间内检测到断连并尝试恢复。
# 在 server 或 location 块中调整超时时间 proxy_read_timeout 86400s; proxy_send_timeout 86400s;
将超时时间设置为较长值(如一天),可以减少因空闲而断开的频率,适合长连接场景。但需注意,过长的超时可能占用资源。前端代码示例:
const ws = new WebSocket('wss://wss.example.com/ws/');
ws.onclose = () => {
setTimeout(() => {
const reconnectWs = new WebSocket('wss://wss.example.com/ws/');
// 处理重连后的逻辑
}, 3000);
};
这段代码在连接关闭后等待 3 秒尝试重连。结合 Nginx 的超时配置,可以构建更稳定的 WebSocket 通信链路。若后端主动断开,Nginx 会立即感知并通知前端,触发重连流程。通过合理设置超时和前端重连策略,可以有效提升 WebSocket 连接的可靠性。


















