Nginx 开发中一些调试方法

2019-11-20

我在学习Nginx中会使用的一些调试方法。踩坑了才摸索出来……

daemon 、master 和 worker

一般情况下 nginx 是通过一个 master 作为daemon进程运行在后台,其又管理着多个worker子进程,而 worker 子进程才是真正处理请求的。 这样一来,调试Nginx就变得复杂了,而Nginx可以通过配置来设定运行方式。nginx.conf 中设置如下:

daemon off; //关闭daemon ,让进程在前台运行;
master_process off; // 关闭 master,不用master来管理worker
worker_processes  1; // worker 进程数量为1,避免多个work竞争处理的情况;

debug 日志

我们知道Nginx可以设置error日志,当发生异常情况时会记录在日志文件中。这里我们也可以通过启用debug , 来查看Nginx运行中更详细的信息。

  • 首先编译Nginx时,添加 --with-debug 参数:./configure --with-debug
  • 编译安装好后,为Nginx配置的错误日志级别为debug:error_log logs/error.log debug;

这样,Nginx会将debug级别的日志也记录在 error.log中。

debug 日志有很多珍贵的信息,如 请求头请求响应信息、 各个阶段处理的情况、location 配置情况 等等。 当然要想完全看懂,需要对Nginx非常了解,我也还在学习中。截取一段如下:

2019/11/19 23:28:20 [debug] 20272#0: *1 http request line: "GET /sub HTTP/1.1"
2019/11/19 23:28:20 [debug] 20272#0: *1 http uri: "/sub"
2019/11/19 23:28:20 [debug] 20272#0: *1 http args: ""
2019/11/19 23:28:20 [debug] 20272#0: *1 http exten: ""
2019/11/19 23:28:20 [debug] 20272#0: *1 http process request header line
2019/11/19 23:28:20 [debug] 20272#0: *1 http header: "Host: localhost:8888"
2019/11/19 23:28:20 [debug] 20272#0: *1 http header: "User-Agent: curl/7.47.0"
2019/11/19 23:28:20 [debug] 20272#0: *1 http header: "Accept: */*"
2019/11/19 23:28:20 [debug] 20272#0: *1 http header done
2019/11/19 23:28:20 [debug] 20272#0: *1 event timer del: 8: 1575818960728
2019/11/19 23:28:20 [debug] 20272#0: *1 rewrite phase: 0
2019/11/19 23:28:20 [debug] 20272#0: *1 test location: "/print"
2019/11/19 23:28:20 [debug] 20272#0: *1 test location: "/sub"
2019/11/19 23:28:20 [debug] 20272#0: *1 using configuration "/sub"

有一点需要注意,日志中记录 debug 信息,日志文件膨胀的非常快,也影响性能(毕竟频繁写文件),生产环境中最好不好开启。

gdb 和 coredump 调试

程序崩溃后,会生成 core 文件以便使用 gdb 进行调试。这一块我不是特别熟,还在学习,之后再补充。

黔ICP备17000852号-4