
nginx源码分析
wellwang1993
这个作者很懒,什么都没留下…
展开
-
nginx定时器的实现
1.采用缓存数组的方式存储时间 1》虽然nginx现在没有采用多线程的方式,但是他还是考虑到了多线程情况下,一般是这俩种情况(1.多线程的方式2.一个进程在读时间的时候被信号中断,而那个信号里面会更新时间,这样导致读错误)所以nginx就采用了一个数组 cached_time[NGX_TIME_SLOTS];共64个成员,每次ngx_time_update()更新的都是下一个位置的slot, 2转载 2016-04-15 10:12:50 · 1061 阅读 · 0 评论 -
nginx upstream的实现
很多其他模块会调用该模块完成对后端服务器的访问 upstream模块还是一个http模块,所有它自己必须要实现一些特定的接口: 1.static ngx_command_t ngx_http_upstream_commands[] = {{ ngx_string("upstream"), NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, n转载 2016-04-20 15:10:20 · 1046 阅读 · 0 评论 -
请求处理
Nginx对于它监听到的每个客户端的连接,都会把它的读事件的handler设置为ngx_http_init_request,它是处理请求的开端,处理请求的过程主要就是解析http请求,再根据请求生成响应 客户端连接来的时候调用Ngx_event_accept,再调用ngx_http_init_connection初始化连接,再把读事件的handler设置为ngx_http_init_request转载 2016-04-19 19:59:52 · 419 阅读 · 0 评论 -
事件模型
.ngx_event_module模块中的一个ngx_commands_t数组只有一个对应得结构体,名字是event,对应得set方法是ngx_events_block ,该模块负责驱动整个事件模块的解析和初始化,而ngx_event_core_module对events块大部分指令的进行解析以及保存 1.ngx_events_block 1》更新ctx_index的值 ctx = ngx_转载 2016-04-18 18:21:19 · 335 阅读 · 0 评论 -
nginx配置文件
1.nginx配置文件格式: nginx配置文件是由多个配置项组成,每个配置项有一个项目名和对应得项目值,可以将项目值分为俩大类,简单配置项和复杂配置项(区分就是是否带大括号) nginx对于简单配置项的处理方式是将那些配置信息转换为Nginx内部控制变量的值,对于复杂配置项来说,只是递归调用解析函数,每一个项目名和项目值有一个token组成,一个项目名可以对应多个项目值, nginx预定义的转载 2016-04-18 11:09:33 · 595 阅读 · 0 评论 -
phase_handler的处理流程
1.nginx把请求的处理过程分为11个阶段 typedef enum { NGX_HTTP_POST_READ_PHASE = 0, /* 读取请求 */ NGX_HTTP_SERVER_REWRITE_PHASE, /* server级别的rewrite */ NGX_HTTP_FIND_CONFIG_PHASE, /* 根据uri查找location */转载 2016-04-18 17:34:38 · 511 阅读 · 0 评论 -
监听socket初始化
主要在俩块内容中用到socket的初始化部分,第一块是在ngx_http_core_srv函数中,在最后设置默认的监听套接口时有把监听socket添加进去,第二块是在ngx_http_block的最后,把配置文件的socket添加进去1.结构信息: 一个port可以对应多个addr,可有多个server监听同一个addr:port,所以在addr中比较重要的几个成员如下: default_ser转载 2016-04-18 15:57:58 · 2157 阅读 · 0 评论 -
http模块初始化过程
1.ngx_http_module_t 所有http模块都是ngx_http_module_t类型,所有的属性都是回调函数,在http模块初始化过程的不同阶段调用。当一个指令既允许出现在main块(在http{}块内,但是在server{}块外的区域)、server块(在server{}块内,但是在location{}块外的区域)、location块内时,就需要对这些指令进行继承和覆盖的处理,由m转载 2016-04-15 19:21:01 · 956 阅读 · 0 评论 -
http块指令解析以及存储
在配置文件一节中已经说明了可能会在ngx_conf_handler中递归的解析块中的指令,而这些块中的指令的解析则是由Ngx_http_core_module来完成的,也就是说当ngx_http_module模块在解析完main的指令以后,如果遇到了server或者location指令的时候则会启用ngx_http_core_module模块 ngx_http_core_module负责解析接下来转载 2016-04-18 13:56:22 · 613 阅读 · 0 评论 -
core模块的初始化
1.core模块的配置结构: typedef struct { ngx_flag_t daemon; ngx_flag_t master; ngx_msec_t timer_resolution; ngx_int_t worker_processes;转载 2016-04-15 17:12:35 · 415 阅读 · 0 评论 -
模块及其初始化
1.nginx的模块: nginx是由各种各样的模块组成,有些模块是默认就会编译进去的,而有些模块则需要通过./configure –with的方式编译进去,所有模块都会被放在一个ngx_moudule[]的全局指针数组里面,数组中的每一个元素都是ngx_module_t的结构体,每个种类的模块有不同的上下文ctx,每个模块有自己支持的命令集ngx_command_t,且在每一个数据结构里面都封装转载 2016-04-15 15:55:25 · 2158 阅读 · 0 评论 -
nginx源码分析之main
nginx启动过程如下。 1.调用ngx_strerror_init()初始化错误列表 strerror(errno)该函数以errno为下标返回错误值,这样初始化的好处是每次出错的时候不用再次调用strerror函数来获取错误原因,而直接根据错误编号找到对应得错误原因,提高执行效率,即他已经存放在一个数组中 2.调用ngx_get_options()解析命令参数;转载 2016-04-15 09:03:39 · 491 阅读 · 0 评论 -
nginx信号的实现
1.nginx信号结构体: typedef struct { int signo; /* 信号值 */ char signame; / 信号名 */ char name; / 信号可读名 */ void (handler)(int signo); /转载 2016-04-15 14:23:45 · 653 阅读 · 0 评论 -
ngx_cycle_init的实现
main函数主要完成的是对ngx_cycle_t结构体变量的一个初始化 ngx_cycle_t * cycle ,init_cycle cycle=ngx_cycle_init(&init_cycle) 流程: 调用ngx_timezone_update()更新时区,调用ngx_time_update()更新时间 创建大小为NGX_CYCLE_POOL_SIZE=16384B的内存池,并从转载 2016-04-15 13:46:37 · 325 阅读 · 0 评论 -
nginx request
是当前的一个请求中Nginx再生成一个请求,一个子请求是要等到父请求执行完以后才会去被执行的,这里有一个比较重要的filter,那就是postpone filter , .request的三个域 //这个表示主的request,也就是当前的request链中最上面的那个request,通过这个域我们就能判断当前的request是不是subrequest。 ngx_http_request_t转载 2016-04-20 17:49:57 · 782 阅读 · 0 评论