Nginx源码分析(4)

Nginx源码分析(4)

前面分析了Nginx的基本数据结构,现在看一下功能模块。

Nginx将各功能模块组成一条链,当有请求到达时,请求依次进过这条链上的部分或全部模块进行处理。


线程模型

Nginx使用一个多进程模型来提供服务,一个master进程和多个worker进程。框架如下:

Nginx源码分析(4)

master分管多个work进程。每个worker执行死循环接收来自客户端的请求。死循环由ngx_worker_process_cycle实现。一个请求的简单处理流程如下:

  • 操作系统提供的机制(例如epoll, kqueue等)产生相关的事件
  • 接收和处理这些事件,如是接受到数据,则产生更高层的request对象
  • 处理request的header和body
  • 产生响应,并发送回客户端
  • 完成request的处理
  • 重新初始化定时器及其他事件

show the code

其中几个关键函数是

ngx_worker_process_init 处理子进程初始化

ngx_process_events_and_timers(cycle)

ngx_worker_process_exit(cycle) 子进程退出

下面来看一下子进程的初始化操作:

  • 全局性的设置,根据全局的配置信息设置执行环境、优先级、限制、setgid、setuid、信号初始化等
  • 调用所有模块的钩子init_process

里面关键的函数是init_process

  • 关闭不使用的socket,关闭当前worker的channel[0]句柄和其他worker的channel[1]句柄,当前worker会使用其他worker的channel[0]句柄发送消息,使用当前worker的channel[1]句柄监听可读事件
  • 在当前worker的channel[1]句柄监听可读事件

ngx_add_channel_event把句柄ngx_channel(当前worker的channel[1])上建立的连接的可读事件加入事件监控队列,事件处理函数为ngx_channel_hanlder。当有可读事件的时候,ngx_channel_handler负责处理消息,具体代码可以查看src/os/unix/ngx_process_cycle.c,过程如下:

0

发表评论

邮箱地址不会被公开。