没有合适的资源?快使用搜索试试~ 我知道了~
Nginx源码研究.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 3 浏览量
2021-10-11
01:40:14
上传
评论
收藏 502KB PDF 举报
温馨提示
试读
47页
Nginx源码研究.pdf
资源推荐
资源详情
资源评论
Nginx源码研究
概貌 ................................................................................................................................................... 3
内存池 ............................................................................................................................................... 5
内存分配相关函数 .............................................................................................................................. 5
内存池结构 .......................................................................................................................................... 5
相关函数 .............................................................................................................................................. 7
小结 ...................................................................................................................................................... 9
ARRAY .............................................................................................................................................. 10
结构 .................................................................................................................................................... 10
相关函数 ............................................................................................................................................ 10
QUEUE ............................................................................................................................................. 11
结构 .................................................................................................................................................... 11
相关函数 ............................................................................................................................................ 12
HASH TABLE ..................................................................................................................................... 12
结构 .................................................................................................................................................... 12
相关函数 ............................................................................................................................................ 14
LIST .................................................................................................................................................. 15
结构 .................................................................................................................................................... 15
相关函数 ............................................................................................................................................ 15
NGINX 启动处理 .............................................................................................................................. 16
WORK进程逻辑 (NGX_WORKER_PROCESS_CYCLE()函数 ) ................................................................ 30
1. 进程部份 ........................................................................................................................................ 30
2. 线程部份 ........................................................................................................................................ 31
3. 回到进程 ........................................................................................................................................ 32
CYCLE ............................................................................................................................................... 32
CONNECTION ................................................................................................................................... 33
CONNECTION
的内存分布 ..................................................................................................................... 33
CONNECTION
的分配与回收 ................................................................................................................. 33
EVENT .............................................................................................................................................. 34
结构 .................................................................................................................................................... 34
相关函数 ............................................................................................................................................ 38
CONNECTION ................................................................................................................................... 38
结构 .................................................................................................................................................... 38
相关函数 ............................................................................................................................................ 42
CONNECTION与 EVENT ................................................................................................................... 42
BUFS ................................................................................................................................................ 44
UPSTREAM ....................................................................................................................................... 46
Nginx 的源码是 0.8.16 版本。不是最新版本,但是与网上其他人研究 nginx 的源码有所修
改。阅读时注意参照对比。
概貌
Nginx 可以开启多个进程, 每个进程拥有最大上限 128 个子线程以及一定的可用连接数。
如果你希望使用线程可以在配置文件中设置 worker_threads 这个参数,但这个参数在
Nginx 官方手册上没有。只有通过阅读源代码才看到。最大客户端连接数等于进程数与
连接数的乘积,连接是在主进程中初始化的,一开始所有连接处于空闲状态。
每一个客户端请求进来以后会通过事件处理机制,在 Linux 是 Epoll ,在 FreeBSD下是
KQueue放到空闲的连接里。
如果设置了线程数, 那么被填充的连接会在子线程中处理, 否则会在主线程中依次处理。
nginx 由以下几个元素组成:
1. worker (进程)
2. thread (线程)
3. connection (连接)
4. event (事件)
5. module (模块)
6. pool (内存池)
7. cycle (全局设置)
8. log (日志)
整个程序从 main()开始算
ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) {
ngx_modules[i]->index = ngx_max_module++;
}
这几句比较关键,对加载的模块点一下数,看有多少个。 ngx_modules 并不是在原代码
中被赋值的,你先执行一下 ./configure 命令生成用于编译的 make 环境。在根目录会
多出来一个文件夹 objs ,找到 ngx_modules.c 文件,默认情况下 nginx 会加载大约 30
个模块,的确不少,如果你不需要那个模块尽量还是去掉好一些。
接下来比较重要的函数是 ngx_init_cycle() ,这个函数初始化系统的配置以及网络连
接等,如果是多进程方式加载的会继续调用 ngx_master_process_cycle() ,这是 main
函数中调用的最关键的两个函数。
ngx_init_cycle() 实际上是个复杂的初始化函数, 首先是加载各子模块的配置信息、 并
初始化各组成模块。
任何模块都有两个重要接口组成,一个是 create_conf ,一个是 init_conf 。分别是创
建配置和初始化配置信息。
模块按照先后顺序依次初始化,大概是这样的:
内核模块 (ngx_core_module) ,
错误日志 (ngx_errlog_module) ,
配置模块 (ngx_conf_module) ,
事件模块 (ngx_events_module) ,
事件内核模块 (ngx_event_core_module) ,
EPOLL模块 (ngx_epoll_module) ,
http 模块 (ngx_http_module) ,
http 内核模块 (ngx_http_core_module) ,
http 日志模块 (ngx_http_log_module) ,
……
epoll 是比较关键的核心模块之一, nginx 兼容多种 IO 控制模型。
内存池
内存分配相关函数
ngx_alloc.c 中包括所有 nginx 内存申请的相关函数。
ngx_alloc() 包装了 malloc() ,仅添加了内存分配失败时的, log 输出和 debug 时的 log
输出。
ngx_calloc() 调用上面的函数,成功分配后,将内存清零。
ngx_memalign() 也是向操作系统申请内存,只不过采用内存对齐方式。 估计是为了
减少内存碎片。 如果操作系统支持 posix_memalign() 就采用它, 如果支持 memalign()
则用 memalign() 。在 0.8.19 版本中,作者不再使用 ngx_alloc() ,而全部改用
ngx_memalign() 。
注:在
nginx
的
main()
函数中,通过将
ngx_pagesize
设置为
1024
来指定内存分配按 1024bytes 对齐。这是不是意味着你虽指示分配 10 bytes 的内存,
实际上
nginx
也向操作系统申请至少
1024bytes
的内存。
内存池结构
Nginx 的内存池类型是 ngx_pool_t 。这个类型定义在 ngx_core.h 中。
typedef struct ngx_pool_s ngx_pool_t;
由定义可知 ngx_pool_t 背后实际上是 struct ngx_pool_s 。这个结构体在 ngx_palloc.h
中有定义。
据说以前版本 nginx 中内存池的结构如下:
struct ngx_pool_s {
u_char *last;
u_char *end;
ngx_pool_t *current;
ngx_chain_t *chain;
ngx_pool_t *next;
ngx_pool_large_t *large;
ngx_pool_cleanup_t *cleanup;
ngx_log_t *log;
};
目前版本中结构则是这样:
内存池管理结点:
剩余46页未读,继续阅读
资源评论
qq_58157133
- 粉丝: 12
- 资源: 11万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功