前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx - Stream 日志模块不完全指北

Nginx - Stream 日志模块不完全指北

作者头像
小小工匠
发布2024-05-26 13:49:45
930
发布2024-05-26 13:49:45
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

Pre

Nginx - stream 模块中按时间记录日志 ngx_stream_log_module


官网

https://nginx.org/en/docs/stream/ngx_stream_log_module.html

在这里插入图片描述
在这里插入图片描述

Nginx Stream模块基础功能

Nginx从1.9.0版本开始引入了Stream模块,该模块支持TCP/UDP的反向代理功能。Stream模块允许Nginx处理与TCP和UDP协议相关的流量,适用于邮件代理、数据库代理等场景。自1.11.4版本开始,Nginx还增加了对Stream会话日志的支持,提供基本的连接统计信息。

Nginx Stream访问日志的缺陷

  1. 日志记录延迟
    • 问题:Nginx会在会话结束时才将日志记录到日志文件中。这意味着对于长时间保持打开的连接(如某些持久连接应用),日志记录会有显著的延迟。
    • 影响:这种延迟可能导致实时监控和及时的故障排除变得困难。
  2. 日志信息有限
    • 问题:Stream会话日志主要记录TCP层面的信息,包括会话持续时间、发送和接收的字节数等。日志不包含应用层的具体数据传输内容。
    • 影响:无法通过Stream日志获取具体的应用层操作信息,这对一些需要详细记录每个请求和响应的场景(如HTTP日志)是不够的。
  3. 缺乏内部发送日志
    • 问题:Stream会话日志不记录会话内部的具体数据包传输,例如一个socket连接建立后多次发送的心跳数据。
    • 影响:这种情况下,详细的操作记录只能在应用层实现,增加了实现的复杂性和系统负担。

解决方案或替代方案

  1. 增强日志记录机制
    • 定期记录:引入中间状态日志记录机制,定期将会话状态写入日志文件,减少日志记录的延迟。
    • 细化日志内容:在可能的情况下,增加对应用层协议(如HTTP、FTP等)的日志支持,记录更多细节。
  2. 结合应用层日志
    • 应用层日志:在应用层实现细粒度的日志记录。例如,在Web服务器应用中,可以在Nginx代理之后的应用服务器上记录详细的HTTP请求和响应日志。
    • 日志聚合:使用集中式日志管理工具(如ELK Stack, Splunk等)聚合和分析来自不同层级的日志,提供全方位的日志分析。
  3. 第三方插件或工具
    • 使用第三方插件:有一些第三方插件可以增强Nginx的日志记录功能,如Nginx第三方模块nginx-log-enhancement
    • 网络监控工具:使用专门的网络监控工具(如Wireshark, Tcpdump等)捕获和分析TCP/UDP流量,可以获得比Nginx Stream日志更详细的信息。

安装和配置nginx-log-enhancement模块

1. 下载nginx-log-enhancement模块源代码

你可以在nginx-log-enhancement的GitHub页面上找到最新的源代码。使用git工具或直接下载zip文件都可以。

2. 解压源代码

如果下载的是zip文件,解压缩至任意目录。

3. 配置Nginx源代码

在编译Nginx之前,需要将nginx-log-enhancement模块包含到Nginx的编译选项中。

代码语言:javascript
复制
cd /path/to/nginx/source
./configure --add-module=/path/to/nginx-log-enhancement

4. 编译和安装Nginx

执行make和make install命令编译和安装Nginx。

代码语言:javascript
复制
make
sudo make install

5. 配置nginx-log-enhancement模块

在Nginx的配置文件中添加日志格式和日志记录。

代码语言:javascript
复制
http {
    log_format enhanced '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '"$upstream_addr" "$upstream_response_time"';

    access_log /var/log/nginx/access.log enhanced;
}

这个例子中,我们使用了增强的log_format格式,并将其用于access_log指令。

6. 重启Nginx

完成配置后,重新加载或重启Nginx服务器。

代码语言:javascript
复制
sudo systemctl reload nginx

7. 测试

使用curl或浏览器访问你的网站,然后检查Nginx日志文件(在这个例子中是/var/log/nginx/access.log),确保已经开始记录增强的日志信息。

通过这些步骤,你可以安装和配置nginx-log-enhancement模块,并增强Nginx的日志记录功能。记得在部署前做好备份,并在测试通过后将配置应用到生产环境中。


不同端口配置不同日志输出

日志格式需要在stream标签内配置,与server标签同级

代码语言:javascript
复制
stream {
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
}

不同端口配置不同日志输出

这段Nginx配置定义了两个服务器块(server blocks),分别监听9100和9200端口。

第一个服务器块
代码语言:javascript
复制
server {
    listen 9100 ssl;
    access_log /opt/nginx-1.24.0/logs/tcp-ssl-access.log proxy;
    ssl_certificate   /opt/nginx-1.24.0/conf/cert/server.crt;
    ssl_certificate_key    /opt/nginx-1.24.0/conf/cert/server.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    proxy_ssl_session_reuse on; 
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    proxy_pass redis;
}
  • listen 9100 ssl;:配置Nginx监听9100端口,并启用SSL/TLS。
  • access_log /opt/nginx-1.24.0/logs/tcp-ssl-access.log proxy;:指定日志文件路径,用于记录访问日志,proxy表示记录代理服务器的访问日志。
  • ssl_certificate /opt/nginx-1.24.0/conf/cert/server.crt;:配置SSL证书的路径。
  • ssl_certificate_key /opt/nginx-1.24.0/conf/cert/server.key;:配置SSL证书私钥的路径。
  • ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;:指定允许的SSL/TLS协议版本。
  • proxy_ssl_session_reuse on;:启用代理服务器SSL会话重用。
  • ssl_ciphers …;:配置SSL密码套件。
  • ssl_session_cache shared:SSL:10m;:配置SSL会话缓存。
  • ssl_session_timeout 10m;:配置SSL会话超时时间。
  • proxy_pass redis;:将接收到的请求转发到redis服务器。

第二个服务器块
代码语言:javascript
复制
server {
    listen 9200;
    access_log /opt/nginx-1.24.0/logs/tcp-access.log proxy;      #日志记录
    proxy_connect_timeout 60s;
    proxy_timeout 60s;
    proxy_pass 127.0.0.1:8100;
    ssl_verify_client on;
    ssl_client_certificate /opt/nginx-1.24.0/conf/cert/ca.crt;
    proxy_ssl   on;  
    ssl_certificate   /opt/nginx-1.24.0/conf/cert/server.crt;
    ssl_certificate_key    /opt/nginx-1.24.0/conf/cert/server.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
}
  • listen 9200;:配置Nginx监听9200端口。
  • access_log /opt/nginx-1.24.0/logs/tcp-access.log proxy;:指定日志文件路径,用于记录访问日志,proxy表示记录代理服务器的访问日志。
  • proxy_connect_timeout 60s;:设置连接到上游服务器的超时时间。
  • proxy_timeout 60s;:设置与上游服务器建立连接后,从上游服务器读取数据的超时时间。
  • proxy_pass 127.0.0.1:8100;:将接收到的请求转发到本地8100端口。
  • ssl_verify_client on;:启用SSL客户端证书验证。
  • ssl_client_certificate /opt/nginx-1.24.0/conf/cert/ca.crt;:配置用于验证客户端证书的CA证书路径。
  • proxy_ssl on;:启用代理服务器SSL。
  • ssl_certificate /opt/nginx-1.24.0/conf/cert/server.crt;:配置SSL证书的路径。
  • ssl_certificate_key /opt/nginx-1.24.0/conf/cert/server.key;:配置SSL证书私钥的路径。
  • ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;:指定允许的SSL/TLS协议版本。

这两个服务器块配置了Nginx监听不同的端口,并针对不同的需求进行了SSL/TLS配置、日志记录、代理转发等设置。

输出如下

代码语言:javascript
复制
==> logs/tcp-access.log <==
111.201.222.10 [18/May/2024:02:37:57 +0000] TCP 200 7490 250 22.959 "127.0.0.1:8100" "250" "7490" "0.003"
111.201.222.10 [18/May/2024:02:45:38 +0000] TCP 200 7777 824 434.695 "127.0.0.1:8100" "824" "7777" "0.001"
111.201.222.10 [18/May/2024:02:45:47 +0000] TCP 200 7478 222 5.642 "127.0.0.1:8100" "222" "7478" "0.009"

==> logs/tcp-ssl-access.log <==
127.0.0.1 [18/May/2024:02:37:57 +0000] TCP 200 7490 250 22.958 "127.0.0.1:6379" "250" "7490" "0.000"
127.0.0.1 [18/May/2024:02:45:38 +0000] TCP 200 7777 824 434.650 "127.0.0.1:6379" "824" "7777" "0.000"
127.0.0.1 [18/May/2024:02:45:47 +0000] TCP 200 7478 222 5.642 "127.0.0.1:6379" "222" "7478" "0.000"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pre
  • 官网
  • Nginx Stream模块基础功能
  • Nginx Stream访问日志的缺陷
  • 解决方案或替代方案
    • 安装和配置nginx-log-enhancement模块
      • 1. 下载nginx-log-enhancement模块源代码
        • 2. 解压源代码
          • 3. 配置Nginx源代码
            • 4. 编译和安装Nginx
              • 5. 配置nginx-log-enhancement模块
                • 6. 重启Nginx
                  • 7. 测试
                    • 第一个服务器块
                    • 第二个服务器块
                • 不同端口配置不同日志输出
                相关产品与服务
                SSL 证书
                腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档