使用gdb调试跟踪nginx的方法与跟踪普通的方法不同。调试的方法是
1.开启nginx,此时nginx的进程已经处于后台运行。
2. gdb -p +worker进程的pid 可以调试worker进程,当然也可以利用这种方法调试他的父进程,但是父进程并没有真正的处理实际的业务。
3. 为这个进程设置断点。
可以发现,nginx的master进程阻塞在sigsuspend 信号上,估计是为了平滑升级的时候使用。
当调试worker进程的时候,设一个端点,发现当没有请求的时候,此时worker进程处于epoll_wait状态,这个跟HAproxy一样,程序阻塞在那里。
可以看出ngx_worker_process_cycle是worker进程处理的核心函数。
ngx_process_events_and_timers 在处理完请求之后,会调用ngx_event_expire_timers() 函数,并找到定时器中的最小的时间,并观察是否这个时间已经超过了当前时间,也就是定时器是否过期,如果过期,那么将这个事件删除,并调用过期时该event的回调函数handler。
ngx_http_keepalive_handler 这个handler函数,会判断这个请求是否过期,如果过期,那么直接关闭这个连接。
-
if (rev->timedout || c->close) {
-
ngx_http_close_connection(c);
-
return;
-
}
当调试的时候出现:value optimized out,有些变量gdb调试看不到,可以通过在objs的目录下的Makefile更改成-O0,然后重新编译即可。
阅读(1066) | 评论(0) | 转发(0) |