文章目录
- Pre
- 官网
- Nginx Stream模块基础功能
- Nginx Stream访问日志的缺陷
- 解决方案或替代方案
- 安装和配置nginx-log-enhancement模块
- 1. 下载nginx-log-enhancement模块源代码
- 2. 解压源代码
- 3. 配置Nginx源代码
- 4. 编译和安装Nginx
- 5. 配置nginx-log-enhancement模块
- 6. 重启Nginx
- 7. 测试
- 不同端口配置不同日志输出
- 第一个服务器块
- 第二个服务器块
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访问日志的缺陷
-
日志记录延迟
- 问题:Nginx会在会话结束时才将日志记录到日志文件中。这意味着对于长时间保持打开的连接(如某些持久连接应用),日志记录会有显著的延迟。
- 影响:这种延迟可能导致实时监控和及时的故障排除变得困难。
-
日志信息有限
- 问题:Stream会话日志主要记录TCP层面的信息,包括会话持续时间、发送和接收的字节数等。日志不包含应用层的具体数据传输内容。
- 影响:无法通过Stream日志获取具体的应用层操作信息,这对一些需要详细记录每个请求和响应的场景(如HTTP日志)是不够的。
-
缺乏内部发送日志
- 问题:Stream会话日志不记录会话内部的具体数据包传输,例如一个socket连接建立后多次发送的心跳数据。
- 影响:这种情况下,详细的操作记录只能在应用层实现,增加了实现的复杂性和系统负担。
解决方案或替代方案
-
增强日志记录机制
- 定期记录:引入中间状态日志记录机制,定期将会话状态写入日志文件,减少日志记录的延迟。
- 细化日志内容:在可能的情况下,增加对应用层协议(如HTTP、FTP等)的日志支持,记录更多细节。
-
结合应用层日志
- 应用层日志:在应用层实现细粒度的日志记录。例如,在Web服务器应用中,可以在Nginx代理之后的应用服务器上记录详细的HTTP请求和响应日志。
- 日志聚合:使用集中式日志管理工具(如ELK Stack, Splunk等)聚合和分析来自不同层级的日志,提供全方位的日志分析。
-
第三方插件或工具
- 使用第三方插件:有一些第三方插件可以增强Nginx的日志记录功能,如Nginx第三方模块
nginx-log-enhancement
。 - 网络监控工具:使用专门的网络监控工具(如Wireshark, Tcpdump等)捕获和分析TCP/UDP流量,可以获得比Nginx Stream日志更详细的信息。
- 使用第三方插件:有一些第三方插件可以增强Nginx的日志记录功能,如Nginx第三方模块
安装和配置nginx-log-enhancement模块
1. 下载nginx-log-enhancement模块源代码
你可以在nginx-log-enhancement的GitHub页面上找到最新的源代码。使用git工具或直接下载zip文件都可以。
2. 解压源代码
如果下载的是zip文件,解压缩至任意目录。
3. 配置Nginx源代码
在编译Nginx之前,需要将nginx-log-enhancement模块包含到Nginx的编译选项中。
cd /path/to/nginx/source
./configure --add-module=/path/to/nginx-log-enhancement
4. 编译和安装Nginx
执行make和make install命令编译和安装Nginx。
make
sudo make install
5. 配置nginx-log-enhancement模块
在Nginx的配置文件中添加日志格式和日志记录。
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服务器。
sudo systemctl reload nginx
7. 测试
使用curl或浏览器访问你的网站,然后检查Nginx日志文件(在这个例子中是/var/log/nginx/access.log
),确保已经开始记录增强的日志信息。
通过这些步骤,你可以安装和配置nginx-log-enhancement模块,并增强Nginx的日志记录功能。记得在部署前做好备份,并在测试通过后将配置应用到生产环境中。
不同端口配置不同日志输出
日志格式需要在stream标签内配置,与server标签同级
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端口。
第一个服务器块
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服务器。
第二个服务器块
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配置、日志记录、代理转发等设置。
输出如下
==> 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"