深入理解与配置 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官网详细配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30618.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python - 轻量级后端框架 Flask

Flask是什么? Flask是一个轻量级的Python Web框架,用于构建Web应用程序和API。简单、灵活、易扩展,适合小型项目或需要快速开发的应用。 接口的输入和输出 输入:request GET参数、POST JSON数据、POST表单 from flask import…

<论文>MiniCPM:利用可扩展训练策略揭示小型语言模型的潜力

一、摘要 本文跟大家一起阅读的是清华大学的论文《MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies》 摘要: 对具有高达万亿参数的大型语言模型(LLMs)的兴趣日益增长,但同时也引发…

好玩的谷歌浏览器插件-自定义谷歌浏览器光标皮肤插件-Chrome 的自定义光标

周末没有啥事 看到了一个非常有意思的插件 就是 在使用谷歌浏览器的时候,可以把鼠标的默认样式换一个皮肤。就像下面的这种样子。 实际谷歌浏览器插件开发对于有前端编程基础的小伙伴 还是比较容易的,实际也是写 html css js 。 所以这个插件使用的技术…

3.使用ElementUI搭建侧边栏及顶部栏

1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前,需要在项目文件夹中安装ElementUI,在终端中输入以下命令,进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…

调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)

文章目录 调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder(知识库变体)4.2 FastGPT(…

matlab常见的配图代码实现1

1. 折线图 x linspace(0, 10, 100); y1 sin(x);y2 cos(x); figure; plot(x, y1, -o, LineWidth, 2, MarkerSize, 6, MarkerFaceColor, b); hold on;plot(x, y2, -s, LineWidth, 2, MarkerSize, 6, MarkerFaceColor, r); title(折线图); xlabel(X轴); ylabel(Y轴); legend(s…

【汇编语言】单片机程序执行过程

一、任务需求 指示灯LED4闪烁,亮0.5秒,灭0.5秒,无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十二) socketio 消息处理

1.后端 在message.controller.js中 在sendMessage方法中 每当我们发送消息 需要socketio把这个消息转发给 接收人 加入转发逻辑 // 把消息发给指定的用户的socket const receiverSocketId getReceiverSocketId(receiverId); if(receiverSocketId) { io.to(receiverSocket…

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…

SmolVLM2 - 将视频理解带到每个设备

本文翻译整理自:SmolVLM2: Bringing Video Understanding to Every Device https://huggingface.co/blog/smolvlm2 文章目录 TL;DR: SmolVLM 现在可以观看 📺 并拥有更好的视觉理解一、关于 SmolVLM2二、 技术细节1、SmolVLM2 2.2B: 我们新的视觉和视频明…

Cocos Creator Shader入门实战(三):CCEffect参数配置讲解

引擎版本:3.8.5 您好,我是鹤九日! 回顾 稍微回顾下前面两篇博客讲解的内容: 一、Cocos渲染效果的实现需要Material材质和Effect资源的互相配合。 二、Effect资源负责Shader片段的编写和属性配置,Material材质负责对E…

计算机毕业设计:公司烤箱配件质量信息追溯系统

超级管理员表创建语句如下: 公司烤箱配件质量信息追溯系统mysql数据库创建语句公司烤箱配件质量信息追溯系统oracle数据库创建语句公司烤箱配件质量信息追溯系统sqlserver数据库创建语句公司烤箱配件质量信息追溯系统springspringMVCmybatis框架对象(javaBean,pojo…

【移动WEB开发】rem适配布局

目录 1. rem基础 2.媒体查询 2.1 语法规范 2.2 媒体查询rem 2.3 引入资源(理解) 3. less基础 3.1 维护css的弊端 3.2 less介绍 3.3 less变量 3.4 less编译 3.5 less嵌套 3.6 less运算 4. rem适配方案 4.1 rem实际开发 4.2 技术使用 4.3 …

Java后端高频面经——计算机网络

TCP/IP四层模型?输入一个网址后发生了什么,以百度为例?(美团) (1)四层模型 应用层:支持 HTTP、SMTP 等最终用户进程传输层:处理主机到主机的通信(TCP、UDP&am…

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…

《Python实战进阶》No16: Plotly 交互式图表制作指南

No16: Plotly 交互式图表制作指南 Plotly是一款用来做数据分析和可视化的在线平台,功能真的是非常强大,它主要有以下特点: 图形多样化:在线绘制多种图形,比如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭…

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例 一、引言&#xff1a;智能化时代的提示工程工具 在人工智能技术广泛应用的时代背景下&#xff0c;如何与AI模型进行有效交互已成为关键技能。本文介绍的"AI任务需求与提示语策略生成器"正是基于…

【MySQL】(4) 表的操作

一、创建表 语法&#xff1a; 示例&#xff1a; 生成的数据目录下的文件&#xff1a; 二、查看表结构 三、修改表 语法&#xff1a; 另一种改表名语法&#xff1a;rename table old_name1 to new_name1, old_name2 to new_name2; 示例&#xff1a; 四、删除表 语法&#xf…

基于STM32物联网水质监测系统的设计与实现/基于STM32的水产养殖云监控系统设计

1. 系统方案介绍 随着水质污染问题的日益严峻&#xff0c;实时监测水质变得尤为重要。水质监测系统能够通过采集水体中的各种数据&#xff0c;及时发现水质问题&#xff0c;保障饮用水安全。本文将介绍一款基于STM32单片机的物联网水质监测系统&#xff0c;该系统采用了ESP826…