Nginx学习笔记---ngx_buf_t数据结构
typedef struct ngx_buf_s ngx_buf_t;
typedef void *ngx_buf_tag_t;
struct ngx_buf_s {/** pos通常是用来告诉使用者本次应该从pos这个位置开始处理内存中的数据,这样设置是因为同一个* ngx_buf_t可能被多次反复处理。当然,pos的含义是由使用它的模板定义的*/u_char *pos;/* last通常表示有效的内容到此为止,注意,pos与last之间的内存是希望nginx处理的内容 */u_char *last;/** 处理文件时,file_pos与file_last的含义与处理内存时的pos与last相同,* file_pos表示将要处理的文件位置,file_last表示截至的文件位置。*/off_t file_pos;off_t file_last;/* 如果ngx_buf_t缓冲区用于内存,那么start指向这段内存的起始地址 */u_char *start;/* 与start成员对应,指向缓冲区内存的末尾 */u_char *end;/* 表示当前缓冲区的类型,例如由哪个模块使用就指向这个模块ngx_module_t变量的地址 */ngx_buf_tag_t tag;/* 引用的文件 */ngx_file_t *file;/** 当前缓冲区的影子缓冲区,该成员很少用到。当缓冲区转发上游服务器的响应时才使用了shadow成员,* 这是因为nginx太节约内存了,分配一块内存并使用ngx_buf_t表示接收到的上游服务器响应后,* 在向下游客户端转发时可能会把这块内存存储到文件中,也可能直接向下游发送,此时nginx绝对不会* 重新复制一份内存用于新的目的,而是再次建立一个ngx_buf_t结构体指向原内存,这样多个ngx_buf_t* 结构体指向了同一份内存,它们之间的关系就通过shadow成员来引用,一般不建议使用。*/ngx_buf_t *shadow;/* 临时内存标志位,为1时表示数据在内存中且这段内存可以修改 */unsigned temporay:1;/* 标志位,为1时表示数据在内存中且这段内存不可以修改 */unsigned memory:1;/* 标志位,为1时表示这段内存是用nmap系统调用映射过来的,不可以修改 */unsigned mmap:1;/* 标志位,为1时表示可回收 */unsigned recycled:1;/* 标志位,为1时表示这段缓冲区处理的是文件而不是内存 */unsigned in_file:1;/* 标志位,为1时表示需要执行flush操作 */unsigned flush:1;/** 标志位,对于操作这块缓冲区时是否使用同步方式,需谨慎考虑,这可能会阻塞nginx进程,nginx中所有* 操作几乎都是异步的,这是它支持高并发的关键。有些框架代码在sync为1时可能会有阻塞的方式进行I/O* 操作,它的意义视使用它的nginx模块而定。*/unsigned sync:1;/** 标志位,表示是否是最后一块缓冲区,因为ngx_buf_t可以由ngx_chain_t链表串联起来,因此为1时,* 表示当前是最后一块待处理的缓冲区。 */unsigned last_buf:1;/* 标志位,表示是否是ngx_chain_t中的最后一块缓冲区 */unsigned last_in_chain:1;/* 标志位,表示是否是最后一个影子缓冲区,与shadow域配合使用。通常不建议使用它 */unsigned last_shadow:1;/* 标志位,表示当前缓冲区是否属于临时文件 */unsigned temp_file:1;
}
缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。
typedef struct ngx_chain_s ngx_chain_t;
struct ngx_chain_s {ngx_buf_t *buf;ngx_chain_t *next;
}
buf指向当前的ngx_buf_t缓冲区,next则用来指向于下一个ngx_chain_t。如果这是最后一个ngx_chain_t,则需要把next置为NULL。
在向用户发送HTTP包体时,就要传入ngx_chain_t链表对象,注意,如果是最后一个ngx_chain_t,那么必须将next置为NULL,否则永远不会发送成功,而且这个请求将一直不会结束。
转载于:https://blog.51cto.com/sofar/1327728
Nginx学习笔记---ngx_buf_t数据结构相关推荐
- Nginx学习笔记---ngx_table_elt_t数据结构
typedef struct {ngx_uint_t hash;ngx_str_t key;ngx_str_t value;u_char *lowcase_key; } ngx_table_elt_t ...
- 全是精髓!也许是最完美的“Nginx学习笔记”了,阿里云高工“365”天手写!
前言 "Nginx",一个高性能的HTTP和反向代理web服务器,Nginx因为内存少.并发能力强的特性,深受虚拟机主机提供商的欢迎,可以支持高达50000个并发连接数的响应.Ng ...
- nginx 学习笔记(2) nginx新手入门
这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...
- nginx学习笔记-01nginx入门,环境搭建,常见命令
nginx学习笔记-01nginx入门,环境搭建,常见命令 文章目录 nginx学习笔记-01nginx入门,环境搭建,常见命令 1.nginx的基本概念 2.nginx的安装,常用命令和配置文件 3 ...
- python的基本数据结构_Python学习笔记——基本数据结构
列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...
- Nginx学习笔记3:Shell脚本检测Nginx服务状态
前言 nginx 服务启动后,我们需要对其服务状态进行监控,今天学习过程中了解到一段非常有用的小脚本,不仅可以监控Nginx,也可以用来监控其他服务 脚本 A=`ps -C nginx –no-hea ...
- 【005】Nginx学习笔记-Nginx真实IP
[005]Nginx学习笔记-Nginx真实IP 真实IP 客户端真实IP 深入理解真实IP 实验一 实验二: 多个代理服务器的情况 实验三:利用realip模块获取客户端真实IP 实验四:伪装请求头 ...
- Nginx学习笔记09——URLRewrite伪静态
URLRewrite 伪静态配置 因为jsp获取url参数很方便,所以需要将tomcat服务器上的index.html转为jsp格式的,方式是在html文件开头加上<%@ page conten ...
- Nginx 学习笔记
Nginx 学习笔记 文章目录 Nginx 学习笔记 1.Nginx 的简介 1.1正向代理 1.2反向代理 1.3负载均衡 1.4动静分离 1.5Nginx的安装 1.6Nginx的常用命令 1.7 ...
最新文章
- Python多线程中阻塞(join)与锁(Lock)的使用误区
- oracle 11gr2 单机数据库使用asm,RHEL7上安装11gR2单机使用ASM存储搭建Physical Standby笔记...
- 搜索专题【2010】四2.过河问题
- 有sql漏洞的php脚本,DedeCms V57 plus/search.php 文件SQL注射0day漏洞脚本安全 -电脑资料...
- 计算机网络第4版潘爱民_学术活动 钱江会计实务精英讲坛预告(第84期)| 何继昌 : 战略视角下之财务分析应用实践 兼选股案例分享...
- Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)
- 如何分析request download在R3AR3显示成功执行,但是对应material没有生成的问题
- [Ext JS]5.9 嵌套Grid的实现及注意事项
- 计算机最低分怎么英语,编写一个学生类 有年龄 英语、数学、计算机三门成绩 求平均分、最高分、最低分...
- android开发案例3--学生通讯录
- log10/log2--求常用对数/以2为底的对数
- java word转换pdf(先自定义添加水印 后转换pdf)通过 aspose-words
- Java(springboot)连接MongoDB,终于成功啦T_T【呸】
- Taro 小程序开发大型实战(三):实现微信和支付宝多端登录
- 开启HSTS让浏览器强制跳转HTTPS访问
- 细小零件、产品边缘或曲面的无接触测厚技术研究
- 浅谈非极大值抑制和IOU
- node.js+uni计算机毕设项目联影医疗器械管理系统小程序(程序+小程序+LW)
- guest vlan
- Cocos2d-x动漫联盟横版格斗游戏截图