ToB企服应用市场:ToB评测及商务社交产业平台

标题: Nginx R31 doc-17-debugging 调试 [打印本页]

作者: 种地    时间: 2024-5-29 21:52
标题: Nginx R31 doc-17-debugging 调试
前言

大家好,我是老马。很高兴碰到你。
我们为 java 开辟者实现了 java 版本的 nginx
https://github.com/houbb/nginx4j
假如你想知道 servlet 怎样处理的,可以参考我的另一个项目:
手写从零实现简易版 tomcat minicat
手写 nginx 系列

假如你对 nginx 原理感兴趣,可以阅读:
从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?
从零手写实现 nginx-02-nginx 的核心能力
从零手写实现 nginx-03-nginx 基于 Netty 实现
从零手写实现 nginx-04-基于 netty http 出入参优化处理
从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)
从零手写实现 nginx-06-文件夹主动索引
从零手写实现 nginx-07-大文件下载
从零手写实现 nginx-08-范围查询
从零手写实现 nginx-09-文件压缩
从零手写实现 nginx-10-sendfile 零拷贝
从零手写实现 nginx-11-file+range 合并
从零手写实现 nginx-12-keep-alive 连接复用
NGINX 调试

通过调试二进制文件、调试日志和核心转储来清除 NGINX 或 NGINX Plus 部署中的问题并追踪错误。
介绍

调试帮助您在程序代码出现问题时识别错误。它通常用于开辟或测试第三方或实验性模块。
NGINX 调试功能包罗调试日志和创建核心转储文件以及进一步的回溯。
配置 NGINX 二进制文件进行调试

首先,您需要在 NGINX 二进制文件中启用调试。NGINX Plus 已经为您提供了 nginx-debug 二进制文件,而 NGINX Open Source 需要重新编译。
配置 NGINX Plus 二进制文件

从版本 8 开始,NGINX Plus 与尺度二进制文件一起提供 nginx-debug 二进制文件。要在 NGINX Plus 中启用调试,您需要从 nginx 切换到 nginx-debug 二进制文件。打开终端并运行以下下令:
  1. service nginx stop && service nginx-debug start
复制代码
完成后,在配置文件中启用调试日志。
编译 NGINX Open Source 二进制文件

要在 NGINX Open Source 中启用调试,您需要使用 configure 脚本中指定的 --with-debug 标志重新编译它。
要编译支持调试的 NGINX Open Source:
  1. nginx -V 2>&1 | grep arguments
复制代码
  1. ./configure --with-debug <其他 configure 参数>
复制代码
  1. sudo make
  2. sudo make install
复制代码
NGINX 和调试符号

调试符号有助于获取用于调试的附加信息,例如函数、变量、数据结构、源文件和行号信息。
NGINX 默认使用“-g”标志编译,此中包含调试符号。
但是,假如在运行回溯时出现“没有可用的符号表信息”错误,则表现缺少调试符号,您需要重新编译 NGINX 并支持调试符号。
确切的编译器标志取决于编译器。例如,对于 GCC 编译器系统:
  1. ./configure --with-debug <其他 configure 参数>--with-cc-opt='-O0 -g' ...
复制代码
在 NGINX 配置中启用调试日志

调试日志记录错误和与调试相关的任何信息,默认情况下是禁用的。要启用它,请确保 NGINX 已编译支持调试(参见“为调试配置 NGINX 二进制文件”),然后在 NGINX 配置文件中使用 error_log 指令的 debug 参数启用它。调试日志可以写入文件、内存中的分配缓冲区、尺度错误输出或 syslog。
发起在 NGINX 配置的“main”级别上启用调试日志,以获得正在进行的完备情况。
将调试日志写入文件

将调试日志写入文件可能会在高负载下降低性能。还要注意,文件可能会变得非常大,快速消耗磁盘空间。为减少负面影响,您可以配置调试日志写入内存缓冲区,或为特定 IP 地址设置调试日志。有关具体信息,请参阅“将调试日志写入内存”和“选定 IP 的调试日志”。
要启用将调试日志写入文件:
将调试日志写入内存

调试日志可以使用循环缓冲区写入内存。优点是,在高负载下,调试级别的日志记录对性能影响不大。
要启用将调试日志写入内存:
从内存中提取调试日志

可以使用在 GDB 调试器中执行的脚本从内存缓冲区中提取日志。
要从内存中提取调试日志:
选定 IP 的调试日志

可以为特定 IP 地址或 IP 地址范围启用调试日志。在生产环境中,记录特定 IP 可能很有效,由于它不会对性能产生负面影响。IP 地址在事件块中的 debug_connection 指令中指定;该指令可以定义多次:
  1. error_log /path/to/log;
  2. ...
  3. events {
  4.     debug_connection 192.168.1.1;
  5.     debug_connection 192.168.10.0/24;
  6. }
复制代码
每个假造主机的调试日志

通常,error_log 指令在主上下文中指定,因此适用于所有其他上下文,包罗服务器和位置。
但是,假如在特定服务器或位置块内指定了另一个 error_log 指令,则会覆盖全局设置,并且这样的 error_log 指令将设置自己的日志文件路径和调试日志级别。
要为特定假造主机设置调试日志,请在特定服务器块内添加 error_log 指令,并设置新的日志文件路径和调试日志级别:
  1. error_log /path1/to/log debug;
  2. ...
  3. http {
  4.     ...
  5.     server {
  6.     error_log /path2/to/log debug;
  7.     ...
  8.     }
  9. }
复制代码
要禁用特定假造主机的调试日志,请在特定服务器块内指定 error_log 指令,并仅指定日志文件路径:
  1. error_log /path/to/log debug;
  2. ...
  3. http {
  4.     ...
  5.     server {
  6.     error_log /path/to/log;
  7.     ...
  8.     }
  9. }
复制代码
启用核心转储

核心转储文件可以帮助识别和修复导致 NGINX 崩溃的问题。核心转储文件可能包含诸如密码和私钥之类的敏感信息,因此请确保对它们进行安全处理。
为了创建核心转储文件,必须在操作系统和 NGINX 配置文件中都启用它们。
在操作系统中启用核心转储

在操作系统中执行以下步调:
在 NGINX 配置中启用核心转储

要在 NGINX 配置文件中启用核心转储:
通过这些设置,核心转储文件将在“/tmp/cores/”目录中创建,只有当其大小不超过 500 兆字节时才会创建。
从核心转储文件中获取回溯信息

回溯提供了关于程序崩溃时堕落的信息。
要从核心转储文件中获取回溯信息:
假如“backtrace”下令返回“没有可用的符号表信息”消息,则需要重新编译 NGINX 二进制文件以包含调试符号。请参阅NGINX和调试符号。
从运行中的历程中转储NGINX配置

您可以从主历程内存中提取当前的NGINX配置。当您需要:
配置转储可以通过提供一个GDB脚原来获得,只要您的NGINX具有调试支持。
确保您的NGINX已经构建了调试支持(在configure参数列表中使用--with-debug选项)。运行下令并检查输出是否包含--with-debug行:
  1. nginx -V 2>&1 | grep -- '--with-debug'
复制代码
获取NGINX工作历程的PID:
  1. ps axu | grep nginx
复制代码
启动GDB调试器:
  1. sudo gdb -p <在上一步中获取的NGINX PID><在上一步中获得的 nginx PID>
复制代码
复制并粘贴脚本到GDB中,然后按“Enter”键。该脚本将配置生存在当前目录中的nginx_conf.txt文件中:
  1. set $cd = ngx_cycle->config_dump
  2. set $nelts = $cd.nelts
  3. set $elts = (ngx_conf_dump_t*)($cd.elts)
  4. while ($nelts-- > 0)
  5. set $name = $elts[$nelts]->name.data
  6. printf "Dumping %s to nginx_conf.txt\n", $name
  7. append memory nginx_conf.txt \
  8.       $elts[$nelts]->buffer.start $elts[$nelts]->buffer.end
  9. end
复制代码
按下CTRL+D退出GDB。
打开位于当前目录中的nginx_conf.txt文件:
  1. sudo vi nginx_conf.txt
复制代码
在哀求帮助时
在哀求调试帮助时,请提供以下信息:
  1. nginx -V
复制代码
参考资料

https://docs.nginx.com/nginx/admin-guide/monitoring/debugging/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4