Nginx04-nginx调试与日志分析

查看模块(组)

less /path/to/objs/ngx_modules.c

调试

调试输出配置

下载echo-nginx-module模块并安装
mv echo-nginx-module-0.60 echo-nginx-module
./configure --add-module=/path/to/echo-nginx-module

location / {
    default_type text/plain;
    echo -n Hello;
    echo $args;
}

echo模块其他常用指令

ech_duplicate        按照指定的次数重复输出指定内容,第1个参数为次数,第2个参数为指定内容
echo_flush           刷新缓冲区的内容,并输出
echo_sleep           按照指定的秒数,延迟输出
echo_reset_timer     重置当前请求花费的时间
echo_location        在当前location中读取其他location中的内容
echo_foreach_split   按照指定的字符分割给出的字符串,并对其进行遍历,其第1个参数表示分隔符,第2个参数表示待分割的字符串
echo_end             用于终止,如echo_foreach_split循环和条件控制结构
echo_exec            内部重定向到指定位置
echo_status          指定默认的响应状态码
echo_before_body     在输出过滤器中整体内容输出前,输出指定内容
echo_after_body      在输出过滤器中整体内容输出后,输出指定内容

调试日志文件

编译时使用--with-debug选项

# 启动新的master进程,旧的pid文件就会命名为.oldbin
kill -USR2 $(cat /var/run/nginx.pid)

# 该信号被用于触发平滑的关闭旧的主进程。
在 Nginx 的重新加载过程中,新的主进程会处理新的连接,旧的主进程会在处理完原有的连接后关闭
kill -WINCH $(cat /var/run/nginx.pid.oldbin)

# 如果新的二进制文件有问题,可以重新加载旧的二进制文件
kill -HUP $(cat /var/run/nginx.pid.oldbin)
# 旧二进制文件启动后,关闭新二进制文件
kill -QUIT $(cat /var/run/nginx.pid)

# 强制关闭新的二进制文件
kill -TERM $(cat /var/run/nginx.pid)

用于调试和定位问题的相关选项

daemon off
是否以守护进程方式运行,默认为on,设为off将在前台运行
方便调试,当修改配置文件后,nginx启动,ctrl+c则可关闭nginx

master_process {on|off}
是否以master/worker模型来运行nginx

error_log 位置 级别
设置日志级别,使用debug级别时,需要在编译nginx时使用--with-debug选项

错误日志

nginx错误日志级别

debug:  最详细的日志级别,记录调试信息
info:   记录常规的信息,例如启动、停止等操作
notice: 记录一般性的重要信息。可以用于记录临时性的问题
warn:   记录警告信息
error:  记录错误信息
crit:   记录严重的错误信息
alert:  记录需要立即采取行动的紧急情况
emerg:  最高级别的日志,表示系统发生了严重的不可恢复的错误

nginx错误日志内容

2019/10/14 18:50:34[error]2632#0:*1 open()"/opt/nginx/html/blog"failed(2:No such 
file or directory),client:127.0.0.1,server: wwwexample.com,request:"GET /blog
HTTP/1.0",host: "www.example.com"

时间戳(2012/10/14 18:50:34);
日志级别(error);
运行 pid(2632);
连接数(1);
系统调用(open);
系统调用的参数(/opt/nginx/html/blog):
从系统调用产生的错误消息(2:Nosuchfile or directory);
造成错误请求的客户端(127.0.0.1);
负责处理请求的server(www.example.com);
请求本身(GET /blog Http/1.0);
在请求中发送的Host头(www.example.com)

nginx错误日志实例

客户端请求错误(例如 400401403404 等):
2024/05/25 12:34:56 [error] 1234#1234: *5678 open() "/path/to/file.html" failed (2: No such file or directory), client: 1.2.3.4, server: example.com, request: "GET /path/to/file.html HTTP/1.1", host: "example.com"
这种错误通常表示客户端发送了一个无效的请求,比如请求的文件不存在。解决方法包括检查请求的 URL 是否正确、文件是否存在、文件权限等。

服务器内部错误(例如 500 系列错误):
2024/05/25 12:34:56 [error] 1234#1234: *5678 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 1.2.3.4, server: example.com, request: "GET /path/to/resource HTTP/1.1", upstream: "http://127.0.0.1:8080/path/to/resource", host: "example.com"
这种错误通常表示服务器在处理请求时遇到了问题,比如与后端应用程序的连接超时、后端应用程序未能正确响应等。解决方法包括增加后端服务器的响应时间、检查后端应用程序的运行状态、调整 nginx 配置等。

SSL/TLS 相关错误:
2024/05/25 12:34:56 [error] 1234#1234: *5678 SSL_do_handshake() failed (SSL: error:1417D18C:SSL routines:tls_process_client_hello:version too low) while SSL handshaking, client: 1.2.3.4, server: example.com
这种错误通常表示 SSL/TLS 握手过程中出现了问题,比如客户端使用了不受支持的 SSL/TLS 版本。解决方法包括升级 SSL/TLS 配置、更新 SSL/TLS 证书、调整 nginx 配置等。

目录索引错误:
2024/05/25 12:34:56 [error] 1234#1234: *5678 directory index of "/path/to/directory/" is forbidden, client: 1.2.3.4, server: example.com, request: "GET /path/to/directory/ HTTP/1.1", host: "example.com"
这种错误通常表示请求了一个目录,但服务器未配置自动索引,因此禁止列出目录内容。解决方法包括配置服务器允许目录索引、提供默认的索引文件、禁止访问目录等。

解析错误日志shell命令

#按照某个字段进行排序:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

#按时间范围筛选日志记录:
awk '$4 >= "[25/May/2024:00:00:00" && $4 <= "[25/May/2024:23:59:59"' /var/log/nginx/access.log

#统计各个IP正常访问次数:
grep '" 200 ' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr

#统计各个IP错误访问次数:
grep -v '" 200 ' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr

#统计各个地址被访问的次数:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

日志分析工具ngxtop

# 安装
yum install ngxtop

# 分析nginx配置文件中 access_log 指定的文件,显示10行uri输出
ngxtop --config /usr/local/nginx/conf/nginx.conf -n 10

# 直接分析指定的日志文件
ngxtop -l /path/to/nginx_log_file

# 对 IP 地址进行不同条件的排名
ngxtop --config /usr/local/nginx/conf/nginx.conf top remote_addr

# 过滤HTTP状态码为502的数据
ngxtop -l /data1/access.log --filter 'status == 502'

posted @   立勋  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示