网站首页 > 技术教程 正文
挫折是一块石头,对于弱者来说它是拌脚石,让你停步不前。而对于强者来说它是垫脚石,使你站得更高。
- 上一篇: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 链表对象。
猜你喜欢
- 2024-10-10 Nginx学习笔记(02)配置文件main段核心参数用法
- 2024-10-10 Nginx配置及应用场景之高级配置(nginx配置cgi)
- 2024-10-10 梅林固件路由通过Entware安装ONMP建立网站步骤方法
- 2024-09-14 Nginx最全详解(万字图文总结)(nginx1)
- 2024-09-14 运维基础服务篇:Nginx配置文件介绍
- 2024-09-14 Nginx-config的配置(nginx 配置说明)
- 2024-09-14 使用javascript轻松扩展nginx的功能
- 2024-09-14 Nginx配置文件详解(nginx的配置文件)
- 2024-09-14 Nginx总结(八)启用Nginx Status及状态参数详解
- 2024-09-14 nginx 文件下载设置及优化(nginx download)
你 发表评论:
欢迎- 最近发表
-
- Linux新手必看:几种方法帮你查看CPU核心数量
- linux基础命令之lscpu命令(linux中ls命令的用法)
- Linux lscpu 命令使用详解(linux常用ls命令)
- 如何查询 Linux 中 CPU 的数量?这几个命令要知道!
- 在linux上怎么查看cpu信息(linux如何查看cpu信息)
- 查看 CPU 的命令和磁盘 IO 的命令
- 如何在CentOS7上改变网卡名(centos怎么改网卡名字)
- 网工必备Linux网络管理命令(网工必备linux网络管理命令是什么)
- Linux 网络命令知多少(linux 网络 命令)
- Linux通过命令行连接wifi的方式(linux命令行连接无线网)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)