编程技术分享平台

网站首页 > 技术教程 正文

Nginx基础入门004(nginx 教程)

xnh888 2024-09-14 15:31:06 技术教程 20 ℃ 0 评论

挫折是一块石头,对于弱者来说它是拌脚石,让你停步不前。而对于强者来说它是垫脚石,使你站得更高。

  • 上一篇:ailx10:Nginx基础入门003 ;
  • 下一篇:ailx10:Nginx基础入门005 ;


1 如何调用HTTP模块

考试要考考试要考 worker进程会在一个for循环中反复调用事件模块检测网络事件。当事件模块检测到某个客户端发起的TCP请求时,将会为它建立TCP连接,成功建立连接后的http请求,会根据nginx.conf文件中的配置交由HTTP框架处理。HTTP框架会试图接收完整的HTTP头部,并在接收到完整的HTTP头部后将请求分发到具体的HTTP模块中处理。

(最常见的时根据请求的URI和nginx.conf里的location配置项的匹配度来决定如何分发。)

HTTP模块在处理请求结束时,会向客户端发送响应,此时会自动地依次调用所有的HTTP过滤模块,每个过滤模块可以根据配置文件来决定自己的行为。

(例如gzip模块会根据配置文件中的gzip on|off来决定是否压缩响应。)

HTTP处理模块在返回时会将控制权交还给HTTP框架,如果在返回前设置了subrequest,那么HTTP框架还会异步调用适合的HTTP模块处理子请求。

开发HTTP模块时注意:

  • HTTP框架到具体的HTTP模块间数据流的传递
  • 待开发的HTTP模块和其他过滤模块协同工作

2 HTTP模块调用方式

  • 典型的调用方式

HTTP框架在接收完HTTP请求的头部后,将请求的URI与配置文件中的所有location进行匹配,匹配后根据location{}内的配置项选择HTTP模块来调用。

  • 非典型的调用方式

ngx_http_access_module模块,它是根据IP地址决定某个客户端是否可以访问服务的。任何HTTP请求都会调用ngx_http_access_module模块处理,这个模块比较靠前的接触到请求。

3 认识Nginx的基本数据结构

3.1 整型的封装

有符号整型无符号整型有符号整型typedef intptr_t ngx_int_t;无符号整型typedef uintptr_t ngx_uint_t;
3.2 ngx_str_t 数据结构(Nginx的字符串)

typedef struct {
    size_t len;
    u_char *data;
}ngx_str_t;

ngx_str_t 有2个成员,data是指向字符串首地址的指针,len表示字符串的有效长度。注意:ngx_str_t的data成员指向的并不是普通的字符串,因为这段字符串可能不是\0结尾,所以使用时必须根据len来使用data。

3.3 ngx_list_t 数据结构(Nginx的链表)

HTTP的头部就是用ngx_list_t 存储的。

typedef struct ngx_list_part_s ngx_list_part_t;

struct ngx_list_part_s {
  void *elts;
  ngx_uint_t nelts;
  ngx_list_part_t *next;
};

typedef struct {
  ngx_list_part_t *last;
  ngx_list_part_t part;
  sizet_t size;
  ngx_uint_t nalloc;
  ngx_pool_t *pool;
} ngx_list_t;

第一部分:ngx_list_t 描述整个链表

  • part: 链表的首个数组元素
  • last: 指向链表的最后一个数组元素
  • szie:每个数组元素占用的空间大小
  • nalloc: 每个ngx_list_part_t的数组大小
  • pool: 用户存放的数据占用的内存由pool分配的

第二部分:ngx_list_part_t 链表的一个元素

  • elts: 指向数组的起始地址
  • nelts: 数组中已经使用了多少个元素,小于nalloc
  • next: 下一个链表元素ngx_list_part_t的地址

接口函数:

  • ngx_list_create:创建新的链表
  • ngx_list_init:初始化一个已有的链表
  • ngx_list_push:添加新的元素

3.4 ngx_table_elt_t 数据结构

typedef struct {
  ngx_uint_t hash;
  ngx_str_t key;
  ngx_str_t value;
  u_char *lowcase_key;// 全小写的key字符串
}ngx_table_elt_t;

为HTTP头部量身订制的key、value数据结构,hash为了快速检索头部。

3.5 ngx_buf_t 数据结构

typedef struct ngx_buf_s ngx_buf_t;
typedef void* ngx_buf_tag_t;
struct ngx_buf_s {
  u_char *pos;// 当前处理位置
  u_char *last;// 有效内容的末尾
  off_t file_pos;
  off_t file_last;
  u_char *start;// 缓冲区的起始地址
  u_char *end;// 缓冲区的末尾地址
  ngx_buf_tag_t tag;// 指向模块ngx_module_t变量的地址,表明哪个模块在使用
  ngx_file_t *file;// 引用的文件
  ngx_buf_t *shadow;
  unsigned temporary:1;// 临时内存标志位,数据在内存中,且可以修改
  unsigned memory:1;// 数据在内存中,且不可以被修改
  unsigned mmap:1;// 用mmapx系统调用映射过来的,不可以被修改
  unsigned recycled:1;// 可回收
  unsigned in_file:1;// 这段缓冲区处理的是文件,不是内存
  unsigned flush:1;// 需要执行flush操作
  unsigned sync:1;// 阻塞IO
  unsigned last_buf:1// 当前处理的是最后一块待处理的缓冲区
  unsigned last_in_chain:1;// ngx_chain_t中的最后一块缓冲区
  unsigned last_shadow:1;
  unsigned temp_file:1// 当时缓冲区属于临时文件
}

3.6 ngx_chain_t 数据结构

typedef struct ngx_chain_s ngx_chain_t;
struct ngx_chain_s {
  ngx_buf_t *buf;
  ngx_chain_t *next;
};

与 ngx_buf_t 配合使用的链表数据结构,buf指向当前的 ngx_buf_t 缓冲区,next指向下一个 ngx_chain_t,如果是最后一个ngx_chain_t,必须要把next设置为NULL,在向用户发送HTTP包体时,就要传入ngx_chain_t 链表对象。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表