node.js - 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
- 110.110.110.100 - 与 Chrome/Firefox 连接的客户端 IP
- 110.110.110.101 - webserver/api 节点公共接口
- 10.0.0.100 - webserver/api 节点私有接口
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已被编辑]
解决方案
我通过比较浏览器到负载均衡器的连接与从脚本启动的连接之间的标头来解决这个问题。结果是浏览器设置了“Connection: keep-alive”标头,它使连接保持打开状态,因此可以使用同一连接发送多个请求。
在负载均衡器公共 ip 上运行此命令以查看连接标头的有用命令:
sudo tcpdump -nn -A -s1500 -l -i eth0 端口 80
需要注意的另一件事是,如果您使用 ufw 作为防火墙,它会设置带有限制的底层 iptables 规则,因此它每分钟只记录第 1 个 3 个连接。
推荐阅读
- python - 如何将列表小部件中的项目链接到qt设计器中表单中的单选按钮?
- react-native - 如何将购买选项移到右侧?
- asp.net-core - 运行“npm run webpack”我得到一个“TypeError:CleanWebpackPlugin 不是构造函数”
- php - 如何在 PHP 中将 ASCII 转换为 ISO-8859-1?
- gitlab - GITLAB Repo 克隆到 Google 可以存储
- windows - 停止并启动 IIS 服务器以进行 TFS 构建访问被拒绝
- google-chrome - Chrome:使用快捷方式从信息亭模式切换到桌面模式
- python - 我们如何根据不同的数据集预测新数据的目标值?scikit 学习 / gaussianNB
- java - 使用 JMeter/Java 上下文的 Scala JSR223 脚本
- javascript - 循环带有获胜条件的基本 Javascript 游戏