深入理解与配置 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.mzph.cn/news/897215.shtml

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

相关文章

【大模型安全】安全解决方案

【大模型安全】安全解决方案 1.技术层面2.数据层面数据收集阶段训练阶段模型推理阶段 1.技术层面 在使用大语言模型时,通常有几种选择:一种是采用封装好的大语言模型SaaS云服务;另一种是在公有云上部署自有的大语言模型,并通过权…

python中httpx库的详细使用及案例

文章目录 1. 安装 httpx2. 同步请求3. 异步请求4. 高级功能5. 错误处理6. 配置客户端7. 结合 Beautiful Soup 使用8. 示例:抓取并解析网页9. 注意事项httpx 是一个现代化的 Python HTTP 客户端库,支持同步和异步请求,功能强大且易于使用。它比 requests 更高效,支持 HTTP/2…

OpenCV计算摄影学(19)非真实感渲染(Non-Photorealistic Rendering, NPR)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 非真实感渲染(Non-Photorealistic Rendering, NPR)是一种计算机图形学技术,旨在生成具有艺术风格或其他非现实…

微信小程序点击按钮,将图片下载到本地

前言&#xff1a; 最近在公司完成一个小程序的时候需要实现一个功能&#xff1a;点击按钮获取用户相册权限&#xff0c;将图片下载到用户本地相册&#xff0c;经过了好几次的尝试最终算是实现了。将总结的经验在这里分享给小伙伴们。 实现方式&#xff1a; //.wxml文件 <…

数据仓库为什么要分层

数据仓库分层架构是数据仓库设计中的一个重要概念&#xff0c;其主要目的是为了更好地组织和管理数据&#xff0c;提高数据仓库的可维护性、可扩展性和性能。分层架构将数据仓库划分为多个层次&#xff0c;每个层次都有其特定的职责和功能。以下是数据仓库分层的主要原因和好处…

selenium库

一、什么是selenium库&#xff1f; selenim是一个用于Web应用程序自动化测试工具&#xff0c;selenium测试直接运行在浏览器中 像真正的用户在操作一样&#xff0c;驱动浏览器执行特定的动作&#xff0c;如点击&#xff0c;下拉等操作 二、selenium在爬虫中的应用 获取动态…

python从入门到精通(二十四):python爬虫实现登录功能

这里写目录标题 requests实现登录功能selenium实现登录功能 requests实现登录功能 使用 requests 库结合会话&#xff08;Session&#xff09;来尝试登录。不过豆瓣有反爬虫机制&#xff0c;这种方式可能会受到验证码等因素的限制 import requests import re# 豆瓣登录页面 l…

十七、从0开始卷出一个新项目之瑞萨RZN2L定时器(GPT)+DMA生成PWM的运动控制

一、概述 嵌入式科普(34)通过对比看透DMA的本质 分享瑞萨RZN2L使用DMA生成PWM的运动控制的例程源码 rzn2l必要的外设资源&#xff1a; rzn2l拥有32-bit timer General PWM Timer (GPT) with 18 channels CPU、GPT最高频率400Mhz DMAC0 and DMAC1 8 channels 8 channels 还…

MR的环形缓冲区(底层)

MapReduce的大致流程&#xff1a; 1、HDFS读取数据&#xff1b; 2、按照规则进行分片&#xff0c;形成若干个spilt&#xff1b; 3、进行Map 4、打上分区标签&#xff08;patition&#xff09; 5、数据入环形缓冲区&#xff08;KVbuffer&#xff09; 6、原地排序&#xff…

解锁STM32外设:开启嵌入式开发新世界

✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 探索 STM32 强大的外设家族 初窥门径&#xff1a;STM32 外设开发基础 开发方式与工具 外设配置基础步骤 深入剖析&#xff1a;常见外设应用实例…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式&#xff0c;实现一般是通过SQL能直接生成数据API&#xff0c;同时能对产生的数据API进行全生命周期的管理&#xff0c;典型的SQL2API的实现模式。 以下是针对…

人工智能之数学基础:对线性代数中逆矩阵的思考?

本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中 将MathType公式编辑器内嵌到WPS工具栏中 下载好所需文件 我用夸克网盘分享了「mathtype安装教程超简单易上手.zip」&#xff0c;点击链接即可保存。打开「夸克APP」 链接&#xff1a;https://pan.quark.cn/s/4726c684…

WPF框架---MvvmLight介绍

目录 1. MvvmLight 框架准备 2. MvvmLight 中的相关基类 3. MvvmLight 中的数据绑定与通知 a. 核心功能 b. 关键方法与属性 c. 完整示例 d. 高级用法 4. MvvmLight 中的命令对象 a. 命令对象的作用 b. 核心接口&#xff1a;ICommand c. MvvmLight 中的 RelayCommand…

【Linux】线程同步与互斥

线程同步与互斥 一.线程互斥1.互斥相关概念2.互斥锁 Mutex3.互斥锁接口4.互斥锁实现原理5.互斥锁封装 二.线程同步1.同步相关概念2.条件变量 Condition Variable3.条件变量接口4.条件变量封装5.信号量 Semaphore6.信号量接口7.信号量封装8.生产者 - 消费者模型1.基于 Blocking …

URIError: URI malformed

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

linux c++11 gcc4 环境编译安装googletest/gtest v1.10

c11对应googletest/gtest 经过测试&#xff0c;c11对应版本是googletest v1.10.x 编译安装 编译环境 sudo apt-get update sudo apt-get install -y build-essential cmake下载或git clone代码 git clone https://github.com/google/googletest.git cd googletest git che…

鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…

极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

LeetCode - 28 找出字符串中第一个匹配项的下标

题目来源 28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;LeetCode&#xff09; 题目解析 暴力解法 本题如果采用暴力解法的话&#xff0c;可以定义两个指针 i&#xff0c;j&#xff0c;其中 i 指针用于扫描 S&#xff08;haystack&#xff09;串&#xff0c;j 指针…