nginx 默认不记录 websocket 代理的长连接日志,但可记录握手请求(http upgrade 阶段),需启用 access_log、自定义日志格式并用 map 区分 ws/http,断开日志需 openresty 或后端配合。

WebSocket 代理连接在 Nginx 中默认不会记录到 access_log,因为 Nginx 将升级后的 WebSocket 连接视为长连接(keep-alive tunnel),不再走常规 HTTP 日志流程。但你可以通过配置让关键阶段(如握手请求)被记录,并结合其他方式间接追踪连接生命周期。
记录 WebSocket 握手请求(HTTP Upgrade 阶段)
WebSocket 连接建立前会先发送一个带 Upgrade: websocket 和 Connection: Upgrade 的 HTTP GET 请求。这个请求是标准 HTTP 请求,Nginx 默认可记录——只需确保 location 块中启用了 access_log,且未被 log_not_found off 或条件日志规则屏蔽。
- 确认你的 WebSocket 代理 location 包含
access_log指令(或继承 server 级日志配置) - 避免在该 location 中使用
access_log off - 可自定义日志格式,突出显示 WebSocket 关键字段:
log_format websocket '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_upgrade" "$http_connection" "$http_sec_websocket_key"';然后在 location 中引用:access_log /var/log/nginx/websocket.log websocket;
区分 WebSocket 请求与普通 HTTP 请求
仅靠 $request 不够直观,建议在日志中显式标记是否为 WebSocket 升级请求:
- 利用
map指令创建变量:
map $http_upgrade $connection_type {
default 'http';
'websocket' 'ws';
}再更新日志格式:'"$connection_type" "$http_upgrade"',这样每条日志开头就能看到 ws 或 http。
记录连接关闭或异常(需配合 openresty 或外部工具)
Nginx 开源版无法直接记录 WebSocket 连接断开时间、持续时长或客户端 IP 断连原因。若需这类信息:
- 使用 OpenResty + Lua:在
log_by_lua_block中读取ngx.var.status和连接状态(需 patch 或较新版本支持) - 开启 Nginx 的
error_log并调高级别(如info),部分连接异常(如超时、reset)会在 error log 中体现 - 在上游服务(如 Node.js/Python 后端)中记录 WebSocket 生命周期事件,更可靠也更完整
验证日志是否生效
用浏览器或 wscat 工具发起一次 WebSocket 连接,检查 access log 是否出现对应条目:
- 请求行应为
GET /ws HTTP/1.1 -
$http_upgrade字段应为websocket -
$status应为101(Switching Protocols)
如果没日志,检查 location 是否匹配、是否被 rewrite 覆盖、或是否启用了 proxy_http_version 1.1 和 proxy_set_header Upgrade $http_upgrade —— 缺少这些会导致握手失败,自然也不会记录成功请求。











