nginx代理websocket需正确配置透传与日志:显式设置upgrade/connection头、http/1.1、长超时及禁用缓冲;自定义log_format记录$ status=101、$http_upgrade等关键字段;通过awk或日志工具筛选101响应并按ip/uri聚合分析连接数、路径热度、地域分布及异常模式。

要对 Nginx 代理的 WebSocket 流量做日志统计与分析,核心在于:让 Nginx 正确透传 WebSocket 协议(升级请求、长连接),同时记录可识别 WebSocket 会话的关键字段(如连接建立、关闭、路径、时长、客户端 IP 等),再通过日志解析工具完成聚合分析。
确保 WebSocket 代理配置正确
Nginx 默认不主动支持 WebSocket,需显式设置头部和超时参数,否则连接会被中断或降级为轮询:
- 必须转发 Upgrade 和 Connection 请求头(大小写敏感)
- 设置 proxy_http_version 1.1,启用 HTTP/1.1 长连接能力
- 调大 proxy_read_timeout(建议设为 3600 或更高),避免空闲连接被误关
- 禁用缓冲:proxy_buffering off,防止 WebSocket 帧被截断或延迟
典型配置示例:
location /ws/ {
proxy_pass http://backend;
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_read_timeout 3600;
proxy_buffering off;
}定制访问日志格式,捕获 WebSocket 关键行为
默认日志无法区分 WebSocket 连接建立与普通 HTTP 请求。需扩展 log_format,加入能标识 WebSocket 升级行为的变量:
- 使用 $status 区分 101(Switching Protocols)表示成功升级
- 添加 $http_upgrade 和 $http_connection,确认是否含 "websocket" 字样
- 记录 $request_time 和 $upstream_response_time,辅助判断连接稳定性
- 用 $request_length 和 $bytes_sent 估算单连接数据量(注意:非实时流量,是连接关闭时汇总值)
推荐日志格式定义:
log_format websocket_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_upgrade $http_connection '
'$request_length $bytes_sent';在 location 中启用:access_log /var/log/nginx/ws-access.log websocket_log;
识别并分离 WebSocket 日志行
不是所有带 /ws/ 路径的请求都是有效 WebSocket 连接。真正建立成功的只有返回状态码 101 且 $http_upgrade = "websocket" 的日志行。
可用 awk 快速提取:
awk '$9 == "websocket" && $4 == "101" {print}' /var/log/nginx/ws-access.log更进一步,按连接维度聚合(例如同一 IP + 同一 URI + 时间相近的 101 行视为一次会话),需借助 Logstash、Fluentd 或 Python 脚本做 session 重建——因为 Nginx 不记录连接生命周期事件(如断开时间),只能靠日志时间戳 + 客户端 IP + URI + request_time 组合近似估算活跃会话数与平均时长。
基础统计与常见分析方向
从清洗后的 WebSocket 日志中,可直接计算以下指标:
-
日均连接数:统计匹配
$status == 101的总行数 -
高频路径:按
$request或$uri分组计数,发现业务热点(如/ws/chat占比 72%) -
地域分布:结合
$remote_addr做 IP 归属地映射(需离线库或 GeoIP 模块) - 异常连接模式:短连高频(request_time 10 次/分钟/IP)可能指向探测或重连风暴
-
后端响应延迟分布:分析
$upstream_response_time的 P95/P99,定位服务瓶颈
简单汇总命令示例(按路径统计连接数):
awk '$4==101 && $9=="websocket" {path[$7]++} END{for (p in path) print p, path[p]}' ws-access.log | sort -k2 -nr











