首页 > 解决方案 > Nginx 访问日志条目在发生时不会为某些连接创建

问题描述

我有一个网站架构如下:

互联网 --> 负载均衡器 --> 网络服务器/api

所以负载均衡器机器上有一个 nginx 设置为负载均衡器,webserver/api 节点上也有一个 nginx 用作反向代理。webserver 服务器接收来自浏览器的请求(通过负载均衡器),通过 HTTP 访问 api 并将页面呈现给浏览器。webserver 和 api 都是 nodejs 应用程序。

nginx 负载均衡器有 webserver-->api 连接的日志条目,但它不会记录初始客户端浏览器-->webserver 连接,直到浏览器关闭(使用 Chrome 和 Firefox 测试)。就好像连接一直处于未完成状态,直到浏览器完全关闭,此时日志条目被写入。

nginx负载均衡器访问日志:

110.110.110.101 - - [21/Feb/2019:22:21:23 +0000] loadbalancer01 TCP 200 186833 825 0.047 upstream: 10.0.0.100:443
110.110.110.100 - - [21/Feb/2019:22:21:37 +0000] loadbalancer01 TCP 200 24327 3856 21.991 upstream: 10.0.0.100:443 <-- only created after browser is closed

webserver->api 连接首先被记录,即使它显然是第二个,客户端浏览器->webserver 连接只有在客户端浏览器完全关闭时才会被记录。

是否有某种缓冲发生?我没有在流块日志记录配置中使用 buffer 参数:

log_format combined '$remote_addr - - [$time_local] $hostname $protocol $status $bytes_sent $bytes_received $session_time upstream: $upstream_addr';

access_log /var/log/nginx/access.log combined;

为什么只有在浏览器关闭时才会记录连接?如何确保在连接发生时记录初始连接?

[更新-添加日志配置,另请注意ips已被编辑]

标签: node.jsnginxload-balancingnginx-reverse-proxynginx-config

解决方案


我通过比较浏览器到负载均衡器的连接与从脚本启动的连接之间的标头来解决这个问题。结果是浏览器设置了“Connection: keep-alive”标头,它使连接保持打开状态,因此可以使用同一连接发送多个请求。

在负载均衡器公共 ip 上运行此命令以查看连接标头的有用命令:

sudo tcpdump -nn -A -s1500 -l -i eth0 端口 80

需要注意的另一件事是,如果您使用 ufw 作为防火墙,它会设置带有限制的底层 iptables 规则,因此它每分钟只记录第 1 个 3 个连接。


推荐阅读