当前位置: 首页 > news >正文

深入理解与配置 Nginx TCP 日志输出

一、背景介绍

在现代网络架构中,Nginx 作为一款高性能的 Web 服务器和反向代理服务器,广泛应用于各种场景。除了对 HTTP/HTTPS 协议的出色支持,Nginx 从 1.9.0 版本开始引入了对 TCP 和 UDP 协议的代理功能,这使得它在处理数据库连接代理、流媒体服务代理等 TCP 相关业务场景中也发挥着重要作用。
在 TCP 代理场景下,准确、详细的日志记录对于监控服务运行状态、排查故障、分析业务流量等工作至关重要。通过合理配置 Nginx 的 TCP 日志输出,运维人员和开发人员能够获取到丰富的信息,如客户端连接来源、后端服务器响应情况、数据传输量等,从而为系统的稳定运行和优化提供有力支持。

二、原理剖析

Nginx 的 TCP 日志输出依赖于其内部的日志模块,在 TCP 代理过程中,当客户端与 Nginx 建立连接,Nginx 再与后端服务器建立连接并进行数据转发时,日志模块会在不同阶段收集各种相关信息。这些信息包括但不限于连接的源地址和目标地址、协议类型、连接状态、数据传输的字节数等。
根据配置的日志格式和规则,日志模块将收集到的信息进行格式化处理,并在适当的时机将日志写入到指定的文件中。默认情况下,Nginx 会在 TCP 连接断开时完成日志记录并写入文件,以减少频繁的磁盘 I/O 操作对性能的影响。然而,通过一些配置调整,我们可以改变日志记录的时机和方式,使其更符合业务需求。

三、详细配置步骤

3.1 确认 Nginx 支持 stream 模块

在进行 TCP 日志配置前,首先要确保 Nginx 已启用stream模块。如果在启动 Nginx 时出现nginx: [emerg] unknown directive "stream"错误,说明 Nginx 在编译时未包含该模块。可以通过重新编译 Nginx 并添加–with-stream选项来解决,或者使用包管理器安装支持stream模块的 Nginx 版本(不同系统的包管理器操作有所不同,如在 Ubuntu 中可尝试安装nginx-stream-module相关包)。

3.2 配置日志格式

在 Nginx 配置文件中,一般在stream模块内定义日志格式。例如:

stream {log_format tcp_log '$remote_addr - $upstream_addr - [$time_local] ''$protocol $status $bytes_sent $bytes_received';...
}

在上述配置中:

  1. $remote_addr表示客户端的 IP 地址。
  2. $upstream_addr是后端服务器的地址。
  3. $time_local为本地时间。
  4. $protocol指使用的协议(如 TCP)。
  5. $status表示连接状态。
  6. b y t e s s e n t 和 bytes_sent和 bytessentbytes_received分别是发送给客户端和从客户端接收的字节数。

3.3 配置访问日志

配置好日志格式后,需要指定日志文件路径以及使用的日志格式。例如:

stream {...access_log /opt/app/nginx/log/doris-proxy.log tcp_log buffer=32k flush=5m;
}

这里,/opt/app/nginx/log/doris-proxy.log是日志文件路径。tcp_log是前面定义的日志格式名称。buffer=32k设置了日志缓冲区大小为 32KB,以减少磁盘 I/O 次数。flush=5m表示每 5 分钟将缓冲区中的日志刷新到磁盘。如果希望日志更实时地记录,可以适当减小flush的时间间隔,如flush=10s。

3.4 配置错误日志

除了访问日志,错误日志对于排查问题也非常重要。在stream模块中添加错误日志配置:

stream {...error_log /opt/app/nginx/log/doris-proxy-error.log notice;
}

/opt/app/nginx/log/doris-proxy-error.log是错误日志文件路径,notice是日志级别。可以根据实际需求调整日志级别,如debug(最详细)、info、warn、error、crit(最简略)。

3.5 配置 TCP 代理服务器并关联日志

在stream模块内配置 TCP 代理服务器,并确保每个server块中关联上述定义的日志配置。例如:

stream {...server {listen 7034;proxy_connect_timeout 300s;proxy_timeout 3880000s;proxy_pass backend_server;access_log /opt/app/nginx/log/doris-proxy.log tcp_log buffer=32k flush=5m;error_log /opt/app/nginx/log/doris-proxy-error.log notice;}
}

backend_server应替换为实际的后端服务器地址或服务器组名称。

3.6 检查配置并重启 Nginx

完成配置修改后,使用nginx -t命令检查配置文件语法是否正确。如果无误,执行sudo service nginx restart命令重启 Nginx 服务,使配置生效。
实际效果如下

四、日志格式详解

Nginx 提供了丰富的内置变量用于日志格式定义,通过组合这些变量,可以创建满足不同需求的日志格式。除了前面提到的常用变量,还有:

  1. $session_time:会话持续时间,即从客户端连接到连接断开的总时长。
  2. $upstream_bytes_sent:发送给后端服务器的字节数。
  3. $upstream_bytes_received:从后端服务器接收的字节数。
  4. $upstream_connect_time:与后端服务器建立连接所花费的时间。

例如,以下是一个更详细的日志格式定义:

log_format detailed_tcp_log '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr" ''"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

这种详细的日志格式能够提供更全面的信息,帮助运维人员深入分析 TCP 连接的整个生命周期和数据传输情况。

五、高级设置

5.1 日志缓存优化

Nginx 使用日志缓存来提高性能,减少磁盘 I/O 操作。除了前面提到的buffer和flush参数,还可以通过open_log_file_cache指令进一步优化日志缓存。例如:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
  1. max:指定缓存中最多可以存储的日志文件描述符数量。
  2. inactive:设置在多长时间内(这里是 20 秒),如果一个日志文件描述符没有被使用,就会从缓存中移除。
  3. valid:表示每隔 1 分钟检查一次缓存中日志文件的状态,确保其有效性。
  4. min_uses:规定一个日志文件描述符至少被使用 2 次后才会被缓存。

5.2 日志轮转

随着时间的推移,日志文件会不断增大,为了管理日志文件大小并保留历史日志,需要进行日志轮转。在类 Unix 系统中,通常使用logrotate工具来实现。例如,在/etc/logrotate.d/目录下创建一个针对 Nginx TCP 日志的配置文件,内容如下:

/opt/app/nginx/log/doris-proxy.log {dailymissingokrotate 7compressdelaycompressnotifemptycreate 640 nginx nginxsharedscriptspostrotate/usr/sbin/nginx -s reopenendscript
}

上述配置表示:

  1. daily:每天进行一次日志轮转。
  2. missingok:如果日志文件不存在,不报错继续执行。
  3. rotate 7:保留 7 天的日志文件,旧的日志文件将被删除。
  4. compress:对轮转后的日志文件进行压缩。
  5. delaycompress:延迟压缩,在下一次轮转时压缩上一次轮转的日志文件。
  6. notifempty:如果日志文件为空,不进行轮转。
  7. create 640 nginx nginx:轮转后创建新的日志文件,权限为 640,所有者和组为nginx。
  8. sharedscripts:只在所有日志文件都轮转后执行一次脚本。
  9. postrotate和endscript之间的命令/usr/sbin/nginx -s reopen:通知 Nginx 重新打开日志文件,以便将新的日志写入新文件。

5.3 基于条件的日志记录

在某些情况下,可能希望只记录特定条件下的 TCP 连接日志。例如,只记录与特定后端服务器通信的日志,或者只记录传输字节数超过一定阈值的日志。虽然 Nginx 原生的 TCP 日志模块没有像 HTTP 模块那样强大的条件日志功能,但可以通过一些第三方模块(如nginx-sticky-module-ng)或结合日志收集工具(如logstash、fluentd)来实现。
例如,使用logstash可以在日志收集阶段对 Nginx TCP 日志进行过滤和处理。在logstash的配置文件中,可以编写如下规则:

input {file {path => "/opt/app/nginx/log/doris-proxy.log"start_position => "beginning"}
}
filter {if [message] =~ /192.168.1.100/ {# 只处理与IP为192.168.1.100的后端服务器相关的日志}
}
output {elasticsearch {hosts => ["localhost:9200"]index => "nginx_tcp_logs"}
}

通过这种方式,可以实现更灵活、更有针对性的日志记录和处理。
通过对 Nginx TCP 日志输出的深入理解和合理配置,能够更好地监控和管理基于 TCP 协议的服务,为系统的稳定运行和优化提供有力支持。希望本文所介绍的内容能帮助读者在实际工作中充分利用 Nginx 的日志功能,提升系统运维和开发的效率。nginx官网详细配置

相关文章:

深入理解与配置 Nginx TCP 日志输出

一、背景介绍 在现代网络架构中,Nginx 作为一款高性能的 Web 服务器和反向代理服务器,广泛应用于各种场景。除了对 HTTP/HTTPS 协议的出色支持,Nginx 从 1.9.0 版本开始引入了对 TCP 和 UDP 协议的代理功能,这使得它在处理数据库…...

Java为什么是跨平台的

一、Java虚拟机(JVM)的抽象层作用 JVAM是Java跨平台的核心技术。Java代码编译后生成字节码(.class文件),这些字节码并非直接由操作系统执行,而是由JVM解释或编译为特定平台的机器码。 屏蔽底层差异:JVM为不同操作系统提供统一的运行时环境,开…...

Sora与AGI的结合:从多模态模型到智能体推理的演进

全文目录: 开篇语前言前言:AGI的挑战与Sora的突破Sora的多模态学习架构:支撑智能体推理的基础1. **多模态学习的核心:信息融合与交叉理解**2. **智能体推理:从感知到决策** Sora如何推动AGI的发展:自主学习…...

一个针对煤炭市场的人工智能项目的开发示例

以下是一个针对煤炭市场的人工智能项目的开发示例,此项目将涵盖数据收集、数据预处理、模型构建、模型训练和预测等步骤。这里我们以预测煤炭价格为例,使用 Python 语言结合常见的机器学习库(如pandas、scikit - learn)来完成。 …...

QILSTE H6-S115FOKYG高亮橙光和黄绿光LED灯珠

型号:H6-S115FOKYG --- 在众多电子元件中,H6-S115FOKYG型号的LED以其独特的性能脱颖而出。这款产品采用了高亮橙光和黄绿光两种颜色,尺寸仅为1.6x1.5x0.55mm,却蕴含着强大的光电性能。其透明平面胶体设计,不仅美观&a…...

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访…...

测试直播postman+Jenkins所学

接口自动化 什么是接口?本质上就是一个url,用于提供数据。后台程序提供一种数据地址,接口的数据一般是从数据库中查出来的。 postman自动化实操: 一般来说公司会给接口文档,如果没有,通过拦截&#xff0c…...

上线DeepSeek大模型,黄山“大位”智算中心正式点亮

2月28日,智启黄山,算领未来——黄山“大位”智算中心点亮仪式在黄山市大位人工智能计算中心举行,标志着黄山“大位”智算中心正式投入运营。同日,DeepSeek-R1大模型在黄山“大位”正式上线,通过“顶尖大模型普惠算力底…...

计算机毕业设计SpringBoot+Vue.js医院药品管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Linux安装nvm和node

执行curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash命令下载安装nvm 执行 source ~/.bashrc命令重新加载shell配置文件以使NVM生效 执行nvm ls-remote 查看可用node版本 如果确定版本,可以直接执行npm install 版本号&#xff0…...

HarmonyOS Next元服务网络请求封装实践

【HarmonyOS Next实战】元服务网络通信涅槃:深度封装如何实现80%性能跃升与零异常突破 ————从架构设计到工程落地的全链路优化指南 一、架构设计全景 1.1 分层架构模型 #mermaid-svg-VOia4RMx7iqmLnu7 {font-family:"trebuchet ms",verdana,arial,…...

网络编程-----服务器(多路复用IO 和 TCP并发模型)

一、单循环服务器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型应用场景 HTTP短连接服务&#xff08;早期Apache&#xff09;CGI快速处理简单测试服务器 3. 综合代码 #include <stdio.h> #include <sys/types.h> /* See NO…...

PostgreSQL 数据库专家可从事以的工作

数据库管理员&#xff08;DBA&#xff09; 职责 负责 PostgreSQL 数据库的日常管理和维护&#xff0c;包括安装、配置、升级数据库系统&#xff0c;确保数据库的稳定运行。 进行数据库性能调优&#xff0c;通过调整数据库参数、优化查询语句等方式&#xff0c;提高数据库的响应…...

如何学习编程?

如何学习编程&#xff1f; 笔记来源&#xff1a;How To Study Programming The Lazy Way 声明&#xff1a;该博客内容来自链接&#xff0c;仅作为学习参考 写在前面的话&#xff1a; 大多数人关注的是编程语言本身&#xff0c;而不是解决问题和逻辑思维。不要试图记住语言本身…...

策略模式详解:实现灵活多样的支付方式

多支付方式的实现&#xff1a;策略模式详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…...

SQL根据分隔符折分不同的内容放到临时表

SQL Server存储过程里根据分隔符折分不同的内容放到临时表里做查询条件&#xff0c;以下分隔符使用“/”&#xff0c;可修改不同分隔符 --根据分隔符折分不同的内容放到临时表--------------- SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id, LTRIM(RTR…...

微信小程序引入vant-weapp组件教程

本章教程,介绍如何在微信小程序中引入vant-weapp。 vant-weapp文档:https://vant-ui.github.io/vant-weapp/#/button 一、新建一个小程序 二、npm初始化 npm init三、安装 Vant Weapp‘ npm i @vant/weapp -...

从零到多页复用:我的WPF MVVM国际化实践

文章目录 第一步&#xff1a;基础实现&#xff0c;资源文件入门第二步&#xff1a;依赖属性&#xff0c;提升WPF体验第三步&#xff1a;多页面复用&#xff0c;减少重复代码第四步&#xff1a;动态化&#xff0c;应对更多字符串总结与反思 作为一名WPF开发者&#xff0c;我最近…...

uniapp 常用 UI 组件库

1. uView UI 特点&#xff1a; 组件丰富&#xff1a;提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持&#xff1a;兼容 App、H5、小程序等多端。高度可定制&#xff1a;支持主题定制&#xff0c;组件样式灵活。实用工具类&#xff1a;提供时间、数组操…...

C++编写Redis客户端

目录 安装redis-plus-plus库 ​编辑 编译Credis客户端 redis的通用命令使用 get/set exists del keys expire /ttl type string类型核心操作 set和get set带有超时时间 set带有NX string带有XX mset mget getrange和setrange incr和decr list类型核心操作…...

OpCore Simplify:零基础黑苹果配置的智能助手

OpCore Simplify&#xff1a;零基础黑苹果配置的智能助手 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于许多电脑爱好者来说&#xff0c;安装黑苹…...

FLUX.1-dev像素生成器效果对比:不同Scale值对像素结构强度影响实测

FLUX.1-dev像素生成器效果对比&#xff1a;不同Scale值对像素结构强度影响实测 1. 像素艺术生成技术概述 像素幻梦&#xff08;Pixel Dream Workshop&#xff09;是基于FLUX.1-dev扩散模型构建的专业像素艺术生成工具。它采用16-bit现代明亮风格设计&#xff0c;为创作者提供…...

嵌入式通信协议SPI/I2C/UART原理与应用

嵌入式通信协议原理图解与技术解析1. 串行通信协议基础1.1 SPI通信协议SPI(Serial Peripheral Interface)是一种全双工、同步串行通信协议&#xff0c;采用主从架构设计。其核心特点包括&#xff1a;四线制结构&#xff1a;SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、SS(片选…...

生物认证锁:用虹膜加密核心模块——软件测试从业者的专业指南

在数字化转型浪潮中&#xff0c;生物认证技术正重塑安全防护体系&#xff0c;其中虹膜识别凭借其超高精度和防伪特性&#xff0c;成为加密核心模块&#xff08;如支付系统、数据库访问控制或敏感API&#xff09;的首选方案。作为软件测试从业者&#xff0c;您肩负着验证系统鲁棒…...

深入解析Shim在跨版本API兼容中的实战应用

1. 什么是Shim技术 第一次听到"Shim"这个词是在调试一个Flink连接Hive的项目时。当时Hive版本从2.3升级到3.1&#xff0c;本以为要重写大量代码&#xff0c;结果同事说"加个Shim就行了"。这种"神奇胶水"般的技术让我印象深刻。 Shim本质上是一种…...

vLLM-v0.17.1应用场景:智能硬件语音助手离线LLM推理部署

vLLM-v0.17.1应用场景&#xff1a;智能硬件语音助手离线LLM推理部署 1. 技术背景与需求分析 智能硬件语音助手正在经历从云端依赖向本地化处理的转变。传统方案面临三大痛点&#xff1a; 网络延迟问题&#xff1a;云端API调用导致响应速度受限隐私安全顾虑&#xff1a;用户对…...

Revit插件开发效率革命:热重载技术如何彻底改变你的开发流程

Revit插件开发效率革命&#xff1a;热重载技术如何彻底改变你的开发流程 【免费下载链接】RevitAddInManager Revit AddinManager update .NET assemblies without restart Revit for developer. 项目地址: https://gitcode.com/gh_mirrors/re/RevitAddInManager RevitA…...

亚洲美女-造相Z-Turbo惊艳案例分享:高还原度旗袍/汉服/都市职场风人像生成

亚洲美女-造相Z-Turbo惊艳案例分享&#xff1a;高还原度旗袍/汉服/都市职场风人像生成 最近在玩一个挺有意思的AI模型&#xff0c;叫“亚洲美女-造相Z-Turbo”。这名字听起来有点技术范儿&#xff0c;但说白了&#xff0c;它就是个专门生成亚洲女性人像的AI工具。 你可能用过…...

突破百度网盘限速:从问题诊断到性能优化的实战全攻略

突破百度网盘限速&#xff1a;从问题诊断到性能优化的实战全攻略 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 问题诊断&#xff1a;揭开网盘下载的痛点图谱 场景引入&…...

Struts2拦截器实战:从零构建权限控制与日志记录

1. Struts2拦截器机制解析 Struts2拦截器是框架最核心的机制之一&#xff0c;它采用AOP&#xff08;面向切面编程&#xff09;思想&#xff0c;在Action执行前后插入自定义逻辑。想象一下拦截器就像地铁安检系统&#xff1a;每个乘客&#xff08;请求&#xff09;都必须经过安检…...