Nginx 访问日志条目不会在某些连接发生时创建

Nginx access logs entries don't get created for some connections when they happen

我的网站架构如下:

互联网 --> 负载均衡器 --> webserver/api

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

nginx 负载平衡器有网络服务器的日志条目-->api 连接,但它不会记录初始客户端浏览器-->网络服务器连接,直到浏览器关闭(使用 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

网络服务器->api 连接首先被记录,尽管它显然是第二个发生的,而客户端浏览器->网络服务器连接仅在客户端浏览器完全关闭时才被记录。

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

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 已被编辑]

我通过比较浏览器连接到负载均衡器与从脚本启动的连接之间的 headers 来解决这个问题。结果浏览器设置 "Connection: keep-alive" header 其中 keeps the connection open 因此可以使用相同的连接发送多个请求。

有用的命令 运行 这在负载均衡器上 public ip 查看连接 headers:

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

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