1. nginx 代码目录结构
在src目录下有如下几个目录:
core event http mail misc os
各子目录存放不同类型的代码,其中:
- core : 该目录存放core module的代码,也是nginx服务的入口
- http : http core module 的代码,nginx作为web/http proxy server运行时的核心模块
- mail : mail core module 的代码,nginx作为pop3/imap/smtp proxy server运行时的核心模块 ( 不在我们本次研究范围内 )
- event : nginx 自身对事件处理逻辑的封装
- os : nginx对各个平台抽象逻辑的封装
- misc : nginx 的一些utils,定义了test和profiler的一些外围模块的逻辑
2. nginx 简单数据类型的表示
在 core/ngx_config.h 目录里定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型
typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t;
其中 ngx_int_t, nginx_flag_t, 都映射为 intptr_t; ngx_uint_t映射为 uintptr_t
这两个类型在/usr/include/stdint.h的定义为:
/* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_t; #endif
所以基本的操作和整形/指针类型的操作类似
3. nginx字符串的数据类型的表示
nginx对c语言的字符串类型进行了简单的封装, core/ngx_string.h/c 里面包含这些封装的内容
其中定义了 ngx_str_t ,ngx_keyval_t, ngx_variable_value_t
这几个基础类型的定义如下
typedef struct { size_t len; u_char *data; } ngx_str_t; typedef struct { ngx_str_t key; ngx_str_t value; } ngx_keyval_t; typedef struct { unsigned len:28; unsigned valid:1; unsigned no_cacheable:1; unsigned not_found:1; unsigned escape:1; u_char *data; } ngx_variable_value_t;
可以看出 ngx_str_t 在原有的uchar* 的基础上加入的字符串长度的附加信息, 初始化使用ngx_string宏进行,他的定义为:
#define ngx_string(str) { sizeof(str) - 1, (u_char *) str }
关于字符串数据类型详见Nginx 基本数据结构 string