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;