nginx是最近比较火的一个web server。 目前我正在读它的源码,网上可参考的资料非常少,大致列下吧
http://wiki.nginx.org/NginxChs
这个小巧且强大的web server是一个俄罗斯人单枪匹马弄出来的,佩服
main函数:
main函数可以在 core/nginx.c 中找到, 开始先call了一堆ngx_xxx_init的初始化函数,暂时跳过,接下来将构建一个ngx_cycle_t的结构体,这个结构体将在下面ngx_master_process_cycle/ngx_single_process_cycle中被调到,初始该结构的函数名为ngx_init_cycle。接下来,如果可能,main调用ngx_daemon以后台方式运行,并创建一个pid文件。最后调用ngx_single_process_cycle或ngx_master_process_cycle
ngx_init_cycle函数:
ngx_init_cycle首先构建一个memory pool,然后初始化一些list结构,line210 - 225中,ngx_init_cycle首先初始化NGX_CORE_MODULE,其中create_conf 和 init_conf 是module需要提供出来的调用接口。接着打开新的文件和共享内存,并调用ngx_open_listening_sockets对cycle->listening这个sockets array进行初始化。接下来ngx_init_cycle对每一个module调用init_module接口。
对于type是NGX_CORE_MODULE的模块,比较典型的有:
ngx_core_module,ngx_events_module,ngx_http_module,ngx_errlog_module,ngx_mail_module
ngx_master_process_cycle函数:
ngx_master_process_cycle主要调用ngx_start_worker_processes和ngx_start_cache_manager_processes。ngx_start_worker_processes将创建worker_processes个工作进程。而此时master进程将等待子进程结束。
ngx_start_worker_processes函数:
ngx_start_worker_processes中通过调用ngx_spawn_process来fork一个ngx_worker_process_cycle进程。ngx_worker_process_cycle会创建ngx_threads_n个线程,该值由worker_threads指定。线程的主函数是ngx_worker_thread_cycle。接下来该进程函数将调用ngx_process_events_and_timers。
ngx_worker_thread_cycle函数:
该函数调用ngx_event_thread_process_posted,这里ngx_event_thread_process_posted会从全局事件队列ngx_posted_events中将事件一个个取出并调用handle接口来处理。handler接口是ngx_event_s结构中的成员函数,比较常用的如ngx_epoll_eventfd_handler,是基于epoll调用的异步事件处理例程