2024年6月11日发(作者:)
Nginx源代码分析
1. Nginx代码的目录和结构
nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很
清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:
├─auto 自动编译安装相关目录
│ ├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等
│ ├─lib 程序依赖的各种库,包括md5,openssl,pcre等
│ ├─os 针对不同操作系统所做的编译配置目录
│ └─types
├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等
├─contrib
├─html
└─src 源码目录
├─core 核心源码目录,包括定义常用数据结构、体系结构实现等
├─event 封装的事件系统源码目录
├─http http服务器实现目录
├─mail 邮件代码服务器实现目录
├─misc 该目录当前版本只包含google perftools包
└─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。
2. 基本数据结构
2.1. 简单的数据类型
在 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
所以基本的操作和整形/指针类型的操作类似。
2.2. 字符串的数据类型
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;


发布评论