摘要:上一节我们讲到了事件驱动的模块,它把我们引入epoll模块,今天我们主要学习下nginx如何使用epoll完成时间驱动,实现高并发;这里不详细讲解epoll原理,如果有机会再做一次单独的epoll的学习。本文来自于:http://blog.csdn.net/lengzijian回忆一下上一节的内容,在我们讲到ngx_process_events_and_timers时,在源码最后提到了ngx_process_events,这里是把我们引入epoll的入口:1.先来看下ngx_process_events的宏定义:src/event/ngx_event.h #define ngx_proces.
阅读全文
摘要:首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数。本篇文章来自于:http://blog.csdn.net/lengzijian/article/details/7601730先来看一下第十九节的部分截图:今天主要讲解的就是事件驱动函数,图中的红色部分:src/event/ngx_event.c void
ngx_process_events_and_timers(ngx_cycle_t *cycle)
{ ngx_uint_t flags; ngx_msec_t timer, ...
阅读全文
摘要:读完之前的学习笔记,相信已经对nginx的启动流程有了一定的认识,从这一节起我们想深入各个模块,学习各个模块的内的主要操作。本文来自于:http://blog.csdn.net/lengzijian/article/details/7598996今天我们就来学习下event模块,在之前的启动里多次提到了调用各个模块的钩子函数,我们先来回忆一下关于event模块钩子函数的执行,也是event模块启动的步骤:1.创建conf(creat_conf):ngx_event_create_conf()该方法,主要是创建了一个ngx_event_conf_t结构体,并且分配内存空间。2.读取配置文件:例如
阅读全文
摘要:学了很久的nginx启动流程,今天决定复习下以前所学的知识,画一个函数调用图,一边之后快速阅读代码。希望对大家有用,由于我的博文被大量网站抓取而且不标注来源,所以决定在图上加上水印,希望各位同学不要喷我。该文章来自:http://blog.csdn.net/lengzijian/article/details/7597852另外:因为不知道大家看的效果怎么样如果需要原图也可以联系我,或者留下邮箱。
阅读全文
摘要:之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets。ngx_add_inherited_sockets:服务器监听套接字的封装。本文的主要灵感来自:http://blog.csdn.net/livelylittlefish/article/details/7277607,感谢作者分享。在ngx_add_inherited_sockets方法内,有一个重要的结构体需要讲解——ngx_listening_ssrc/core/ngx_connection.h
typedef struct ng
阅读全文
摘要:上一节主要讲解主进程如何开启子进程,并且讲解了主进程做的一些操作,这一节主要学习子进程处理函数ngx_worker_process_cyclesrc/os/unix/ngx_process_cycle.c static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{ ngx_uint_t i; ngx_connection_t *c; //在master中,ngx_process被设置为NGX_PROCESS_MASTER ngx_process = N...
阅读全文
摘要:上一节,我们主要讲了多进程时,主进程如何利用信号量控制子进程的,这一节我们主要讲解下子进程的启动,和执行的操作。上一节讲过,真正创建worker子进程的函数是ngx_start_worker_processes,这个函数本身很简单:src/os/unix/ngx_process_cycle.c static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{ ngx_int_t i; ngx_channel_t ch; ngx_log_err...
阅读全文
摘要:了解core模块之前还应改学习ngx_start_worker_processes函数,今天我就来详细学一下这个方法,主要内容来自于http://blog.sina.com.cn/s/blog_677be95b0100iivk.html。nginx的进程启动过程是在ngx_master_process_cycle(src/os/unix/ngx_process_cycle.c)中完成的(单进程是通过ngx_single_process_cycle完成,这里只分析多进程的情况),在ngx_master_process_cycle中,会根据配置文件的worker_processes值创建多个子进程
阅读全文
摘要:再打算正式开始研究core模块式,发现有一个很重要的变量ngx_cycle_t,一直伴随,如果不懂ngx_cycle可能读起代码来回非常困难,这里就来详细学习一下吧。本文大部分灵感来自于。http://blog.csdn.net/livelylittlefish/article/details/7247080和http://blog.sina.com.cn/s/blog_677be95b0100iivi.html谢谢作者提供很详细的资料。依照惯例我们直接来看下/src/core/ngx_cycle.h
struct ngx_cycle_s { void ...
阅读全文
摘要:ngx_buf.{c|h}分为两种类型,一种是file,一种是memory。因此这里会有文件的一些操作域。typedef void * ngx_buf_tag_t; typedef struct ngx_buf_s ngx_buf_t; struct ngx_buf_s { u_char *pos; //已经执行的数据位置 u_char *last; //使用的内存的最后一个字节的指针 off_t file_pos; ...
阅读全文
摘要:ngx_list.{c|h}结构非常简单,如果你看过之前的array介绍,这一节可以一带而过:typedef struct ngx_list_part_s ngx_list_part_t;
struct ngx_list_part_s { void *elts; //数据区域指针 ngx_uint_t nelts; //数据实际个数 ngx_list_part_t *next; //下一个数据指针
};
typedef struct { ngx_list_pa...
阅读全文
摘要:ngx_hash.{c|h}实现了nginx里面比较重要的一个hash结构,这个在模块配置解析里经常被用到。该hash结构是只读的,仅在初始创建时可以给出保存在其中的key-val对儿,然后就只能进行“增删改查”操作了。先来看一下hash结构的内存布局:typedef struct { ngx_hash_t *hash; //指向待初始化的散列结构 ngx_hash_key_pt key; //为计算散列值用的函数指针 ngx_uint_t max_size; ...
阅读全文
摘要:src/core/ngx_queue.{c|h}实现了一个队列的操作逻辑,队列的基本结构为一个双向队列基础数据结构为:typedef struct ngx_queue_s ngx_queue_t; struct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next;
};
根据数据结构可以发现,nginx的队列操作和结构只进行指针操作,不负责节点内容空间的分配和保存,所以在定义自己的队列节点的时候,需要自己定义数据结构以及分配空间,并包含一个ngx_queue_t类型的成员,需要获得原始的数据节点的时候,需要使用ngx_q...
阅读全文
摘要:对应文件为core/ngx_array.{c|h}ngx_array是nginx内部封装的,使用ngx_pool_t对内存池进行分配的数组容器,其中的数据是在一整片内存区中连续存放的。更新数据时只能在尾部压入1个或多个元素。这里单纯的觉得和数组没有差别。数组的实现结构为:struct ngx_array_s { void *elts; //具体的数据区域的指针 ngx_uint_t nelts; //数组实际包含的元素数量 size_t size; //数组单个元素的大小 ngx_uint_t nalloc; ...
阅读全文
摘要:内存分配相关1.系统功能封装内存相关的操作主要在os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c}中。其中os/unix/ngx_alloc.{h,c}封装了最基本的内存分配函数,是对c原有的malloc/free/memalign等函数的封装,对应函数为:a.ngx_alloc:对malloc进行了简单的封装;void *
ngx_alloc(size_t size, ngx_log_t *log)
{ void *p; p = malloc(size); if (p == NULL) { ngx_log_...
阅读全文