随笔分类 - Nginx
关于nginx的些分析
摘要:接上一篇,通过关键代码段的分析、和一些关键函数的摘录对nginx 运用module 模块构架对nginx.conf 进行解析执行的流程有了一个基本认识。流程总结如下: 1、获取全部参与编译的模块module 进行统计编号。 2、根据module 模块的个数分配 配置信息资源的指针空间。 3、创建NGX_CORE_MODULE 核心模块的配置信息,并将指针空间中对应模块编号的指针进行设置。 4、初始化conf 配置信息,解析参数ngx_conf_param,解析配置文件ngx_conf_parse。 以上第4步中解析配置文件ngx_conf_parse过程又可分为: ...
阅读全文
摘要:搭建nginx服务器时,主要的配置文件 nginx.conf 是部署和维护服务器人员经常要使用到的文件, 里面进行了许多服务器参数的设置。那么nginx 以模块 module为骨架的设计下是如何运用模块 module来解析并执行nginx.conf配置文件下的指令的呢?在探究源码之前,需要对nginx下的模块 module 有个基本的认知(详情参考前面的博文 Nginx 源码分析-- 浅谈对模块module 的基本认知)同时也要对nginx中常用到的一些结构有个基本的了解如: 内存池pool 管理相关的函数、ngx_string 的基本结构等(详情参考前面的博文),若不然看代码的时候可能不..
阅读全文
摘要:对于一个web服务器程序来说,对字符串处理的需求是必须的。由于web环境下的各种编码,也导致了web服务器程序字符串处理的繁杂性。在nginx源码中,ngx_string.c 这个文件就是来应对字符串处理的一些源码,源码中经常的使用到了这里中的函数,本文对ngx_string.c 进行一些简单的分析,以方便阅读其他源码。 我们来看它的基本数据结构:typedef struct { size_t len; u_char *data;} ngx_str_t; 比较明显的可以看出,ngx_str_t 只是将字符串添加了一个标志长度的字段,并无其他特殊结构。 ...
阅读全文
摘要:应该说大家对这两个数据结构相当熟悉了,因此我们一并将它们进行分析,瞧一瞧nginx是如何实现它们的。在此篇之前,我们已经对nginx 内存池(pool)进行了分析,在此基础上来理解ngnix对它们的实现将变得非常简单,特别是内存池(pool)中的ngx_palloc 函数在这两个结构中多次用到,若不清楚想了解原理的可以看看我前面写的文章,它返回的是在内存池分配好空间了的首地址。一、ngx_array 数组:struct ngx_array_s { void *elts; ngx_uint_t nelts; size_t size; ng...
阅读全文
摘要:分析nginx源码,谈到模块module是必然的。纵观nginx源码,可以说模块module机制是整个nginx的骨架。因此,对nginx的源码进行分析,那么对模块module就需要有一个基本的认知。在浅谈开始,我们要明确nginx 模块构架是从编译阶段开始的,不像apache那样可以动态的添加模块,nginx使用的是静态模块。这应该也是nginx 为何效率高的原因之一。对nginx的模块认知,必须要提到一篇大大有名的文章,我想也是每个分析nginx源码的人都拜读过的文章《Emiller's Guide To Nginx Module Development 》里面的内容虽然少了点,但
阅读全文
摘要:上一篇已经通过对ngx_palloc 这个内存池(pool)管理的核心函数--内存分配函数进行解析,我们窥探到了Nginx内存管理的主体方法还有对于大内存需求的解决之道,同时也对管理内存池的数据结构有了更深一步的认识,通过这些认识我们可以得到以下这样一张数据结构的示意图:图3 Nginx内存管理数据结构示意图 做说明下,这里示意的是有需求大内存分配时的结构示意图,为了图示的方便,我们将 large_t 特殊话到了和 large所在的同一个pool单元里面,其实实际运行中并非一定在同一个pool单元中。如果没有大内存需求时 large_t 也并不存在。 分析完了,内存分配函数ngx_pa...
阅读全文
摘要:在上一篇中,以一张图(图1)介绍了nginx内存池管理函数的总体概况,并分析了底层支持函数和内存池(pool)管理所需要用到的一些数据结构。这里我们将来具体分析内存池管理功能函数。由上篇图1我们可以看出ngx_palloc为内存分配的核心,为此我们先看看这个函数。void * ngx_palloc(ngx_pool_t *pool, size_t size){ u_char *m; ngx_pool_t *p; /* 注意2个if,3个return */ if (size <= pool->max) { p = pool->curr...
阅读全文
摘要:Nginx内存池(pool)的管理的实现主要写在ngx_palloc.c这个文件中,为了明晰的看该文件中的函数之间的关系,我们描绘出以下一张简单的示意图:图1 Nginx内存池(pool)管理功能函数关系图 由以上图我们可以清晰的看出Nginx内存池(pool)管理函数可分为两部分,一部分底层支持函数主要为ngx_alloc、ngx_free、ngx_align_ptr(内存对齐的宏)、ngx_memalign、ngx_memzero,这部分函数比较简单多为对C语言标准库的一些封装,另一部分内存池管理功能函数如ngx_creat_pool、ngx_destroy_pool、ngx_res...
阅读全文
摘要:1、首先在官网下载Nginx 发布版的源码,Nginx 官网下载的地址是 :http://www.nginx.org/en/download.html因为Nginx官网支持SVN,可以简单方便的使用svn下载的是Nginx 1.3.0 版源码编译,命令如下:svn checkout svn://svn.nginx.org/nginx/tags/release-1.3.02、configure信息的配置说明简单浏览下载的源码后,可以发现和编译相关的信息文件在auto目录下,其中configure也在这个目录下。用vi打开configure,可以发现它应该放在源码的顶级目录下,移动configur
阅读全文