Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)

人工智能面试总结-Python B站:啥都会一点的研究生 公众号试读:啥都会一点的研究生 目录说说Python程序运行过程?说说Python的作用域?说说Python的数据结构?说说Python中可变与不可变类型?说说进程与线程?说说Python中的多线程?说说Python中的多进程?说说Python互斥锁与死锁?说说Lambda?说说Python的深拷贝与浅拷贝?说说Python多线程是否能用多个CPU,为什么?说说Python垃圾回收机制?说说Python里的生成器?说说迭代器与生成器的区别?说说Python 列表的 del,rem. 阅读详情
AI摘要

本文介绍了Nginx中用于处理大数据的缓冲区ngx_buf_t及其链表结构ngx_chain_t。详细解析了这两种数据结构的设计原理及核心函数实现,包括缓冲区创建、链表构建与管理等。

目录

一、数据结构定义

1. 缓冲区内存块的数据结构 ngx_buf_t

2. 缓冲区链表结构 ngx_chain_t

二、数据结构图

三、具体函数实现

1. 创建一个缓冲区buf ngx_create_temp_buf

3. 批量创建多个缓冲区buf ngx_create_chain_of_bufs

4. 拷贝缓冲区链表 ngx_chain_add_copy

5. 获取一个空闲的buf链表结构 ngx_chain_get_free_buf

6. 释放缓冲区链表 ngx_free_chain和ngx_chain_update_chains


Nginx的buf缓冲区数据结构,主要用来存储非常大块的内存。ngx_buf_t数据结构也贯穿了整个Nginx。

Nginx的缓冲区设计是比较灵活的。

  • 可以自定义管理业务层面的缓冲区链表;
  • 也可以将空闲的缓冲区链表交还给内存池pool->chain结构。

缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。

一、数据结构定义


1. 缓冲区内存块的数据结构 ngx_buf_t


typedef struct ngx_buf_s  ngx_buf_t;
/**
 * Nginx缓冲区
 */
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;			/* 缓冲区标记地址,是一个void类型的指针。 */
    ngx_file_t      *file;			/* 引用的文件 */
    ngx_buf_t       *shadow;


    /* the buf's content could be changed */

    unsigned         temporary:1;	 /* 标志位,为1时,内存可修改 */

    /*
     * the buf's content is in a memory cache or in a read only memory
     * and must not be changed
     */
    unsigned         memory:1;   	/* 标志位,为1时,内存只读 */

    /* the buf's content is mmap()ed and must not be changed */
    unsigned         mmap:1;		/* 标志位,为1时,mmap映射过来的内存,不可修改 */

    unsigned         recycled:1;	/* 标志位,为1时,可回收 */
    unsigned         in_file:1;		/* 标志位,为1时,表示处理的是文件 */
    unsigned         flush:1;		/* 标志位,为1时,表示需要进行flush操作 */
    unsigned         sync:1;		/* 标志位,为1时,表示可以进行同步操作,容易引起堵塞 */
    unsigned         last_buf:1;	/* 标志位,为1时,表示为缓冲区链表ngx_chain_t上的最后一块待处理缓冲区 */
    unsigned         last_in_chain:1;/* 标志位,为1时,表示为缓冲区链表ngx_chain_t上的最后一块缓冲区 */

    unsigned         last_shadow:1;	/* 标志位,为1时,表示是否是最后一个影子缓冲区 */
    unsigned         temp_file:1;	/* 标志位,为1时,表示当前缓冲区是否属于临时文件 */

    /* STUB */ int   num;
};
  • 从上面这个数据结构中,可以看到ngx_buf_t结构,即可以处理内存,也可以处理文件。
  • Nginx使用了位域的方法,节省存储空间。
  • 每个buf都记录了开始和结束点以及未处理的开始和结束点,因为缓冲区的内存申请了之后,是可以被复用的。
  • 所有缓冲区需要的数据结构以及缓冲区的buf内存块都会被分配到内存池上面。

2. 缓冲区链表结构 ngx_chain_t


typedef struct ngx_chain_s       ngx_chain_t;
/**
 * 缓冲区链表结构,放在pool内存池上面
 */
struct ngx_chain_s {
    ngx_buf_t    *buf;
    ngx_chain_t  *next;
};
  • 是否还记得内存池结构中,有一个数据结构pool->chain就是保存空闲的缓冲区链表的。
  • Nginx的缓冲区ngx_buf_t,通过ngx_chain_t链表结构进行关联和管理。
  • 通过链表的方式实现buf有一个非常大的好处:如果一次需要缓冲区的内存很大,那么并不需要分配一块完整的内存,只需要将缓冲区串起来就可以了。

二、数据结构图


  • Nginx的缓冲区数据结构主要包含链表数据结构ngx_chain_t和buf数据结构ngx_buf_t
  • Nginx可以在自定义的业务层面管理繁忙busy和空闲free的缓冲区链表结构。通过后边的函数,可以对缓冲区的链表结构和buf结构进行管理。
  • 如果缓冲区链表需要被回收,则会放到Nginx内存池的pool->chain链表上。
  • 缓冲区是Nginx用的非常多的一种数据结构,主要用于接收和输出HTTP的数据信息。所以对Nginx的缓冲区的数据结构深入理解非常有必要。

三、具体函数实现


1. 创建一个缓冲区buf ngx_create_temp_buf


ngx_create_temp_buf直接从pool上创建一个缓冲区的buf,buf大小可以自定义。buf的数据结构和buf内存块都会被创建到pool内存池上。

/**
 * 创建一个缓冲区。需要传入pool和buf的大小
 */
ngx_buf_t *
ngx_create_temp_buf(ngx_pool_t *pool, size_t size)
{
	ngx_buf_t *b;

	/* 最终调用的是内存池pool,开辟一段内存用作缓冲区,主要放置ngx_buf_t结构体 */
	b = ngx_calloc_buf(pool);
	if (b == NULL) {
		return NULL;
	}

	/* 分配缓冲区内存;  pool为内存池,size为buf的大小*/
	b->start = ngx_palloc(pool, size);
	if (b->start == NULL) {
		return NULL;
	}

	/*
	 * set by ngx_calloc_buf():
	 *
	 *     b->file_pos = 0;
	 *     b->file_last = 0;
	 *     b->file = NULL;
	 *     b->shadow = NULL;
	 *     b->tag = 0;
	 *     and flags
	 */

	b->pos = b->start;  //待处理数据的标记指针
	b->last = b->start; //待处理数据的结尾标记指针
	b->end = b->last + size; //缓冲区结尾地址
	b->temporary = 1;

	return b;
}

单独创建缓冲区ngx_buf_t是没法形成回收和管理机制的。所以需要创建ngx_chain_t缓冲区链表结构,用来管理整个缓冲区。

/**
 * 创建一个缓冲区的链表结构
 */
ngx_chain_t *
ngx_alloc_chain_link(ngx_pool_t *pool)
{
	ngx_chain_t *cl;
	/*
	 * 首先从内存池中去取ngx_chain_t,
	 * 被清空的ngx_chain_t结构都会放在pool->chain 缓冲链上
	 */
	cl = pool->chain;

	if (cl) {
		pool->chain = cl->next;
		return cl;
	}
	/* 如果取不到,则从内存池pool上分配一个数据结构  */
	cl = ngx_palloc(pool, sizeof(ngx_chain_t));
	if (cl == NULL) {
		return NULL;
	}

	return cl;
}

3. 批量创建多个缓冲区buf ngx_create_chain_of_bufs


批量创建多个buf,并且用链表串起来。当我们需要的缓冲区非常大的时候,可以通过此方法,分配一个缓冲区链表,用于缓冲区的数据管理。

/**
 * 批量创建多个buf,并且用链表串起来
 */
ngx_chain_t *
ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
{
	u_char *p;
	ngx_int_t i;
	ngx_buf_t *b;
	ngx_chain_t *chain, *cl, **ll;

	/* 在内存池pool上分配bufs->num个 buf缓冲区 ,每个大小为bufs->size */
	p = ngx_palloc(pool, bufs->num * bufs->size);
	if (p == NULL) {
		return NULL;
	}

	ll = &chain;

	/* 循环创建BUF,并且将ngx_buf_t挂载到ngx_chain_t链表上,并且返回链表*/
	for (i = 0; i < bufs->num; i++) {

		/* 最终调用的是内存池pool,开辟一段内存用作缓冲区,主要放置ngx_buf_t结构体 */
		b = ngx_calloc_buf(pool);
		if (b == NULL) {
			return NULL;
		}

		/*
		 * set by ngx_calloc_buf():
		 *
		 *     b->file_pos = 0;
		 *     b->file_last = 0;
		 *     b->file = NULL;
		 *     b->shadow = NULL;
		 *     b->tag = 0;
		 *     and flags
		 *
		 */

		b->pos = p;
		b->last = p;
		b->temporary = 1;

		b->start = p;
		p += bufs->size; //p往前增
		b->end = p;

		/* 分配一个ngx_chain_t */
		cl = ngx_alloc_chain_link(pool);
		if (cl == NULL) {
			return NULL;
		}

		/* 将buf,都挂载到ngx_chain_t链表上,最终返回ngx_chain_t链表 */
		cl->buf = b;
		*ll = cl;
		ll = &cl->next;
	}

	*ll = NULL;

	/* 最终得到一个分配了bufs->num的缓冲区链表  */
	return chain;
}

4. 拷贝缓冲区链表 ngx_chain_add_copy


将其它缓冲区链表放到已有缓冲区链表结构的尾部。

/**
 * 将其它缓冲区链表放到已有缓冲区链表结构的尾部
 */
ngx_int_t ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,
		ngx_chain_t *in)
{
	ngx_chain_t *cl, **ll;

	ll = chain; //chain 指向指针的指针,很绕

	/* 找到缓冲区链表结尾部分,cl->next== NULL;cl = *chain既为指针链表地址*/
	for (cl = *chain; cl; cl = cl->next) {
		ll = &cl->next;
	}

	/* 遍历in */
	while (in) {
		cl = ngx_alloc_chain_link(pool);
		if (cl == NULL) {
			return NGX_ERROR;
		}

		cl->buf = in->buf; //in上的buf拷贝到cl上面
		*ll = cl; //并且放到chain链表上
		ll = &cl->next; //链表往下走
		in = in->next; //遍历,直到NULL
	}

	*ll = NULL;

	return NGX_OK;
}

5. 获取一个空闲的buf链表结构 ngx_chain_get_free_buf


/**
 * 冲空闲的buf链表上,获取一个未使用的buf链表
 */
ngx_chain_t *
ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free)
{
	ngx_chain_t *cl;

	/* 空闲列表中有数据,则直接返回 */
	if (*free) {
		cl = *free;
		*free = cl->next;
		cl->next = NULL;
		return cl;
	}

	/* 否则分配一个新的buf */
	cl = ngx_alloc_chain_link(p);
	if (cl == NULL) {
		return NULL;
	}

	cl->buf = ngx_calloc_buf(p);
	if (cl->buf == NULL) {
		return NULL;
	}

	cl->next = NULL;

	return cl;
}

6. 释放缓冲区链表 ngx_free_chain和ngx_chain_update_chains


  • ngx_free_chain:直接交还给Nginx内存池的pool->chain空闲buf链表
  • ngx_chain_update_chains:可以交还给自定义的空闲链表上。
//直接交还给缓存池
#define ngx_free_chain(pool, cl)                                             \
    cl->next = pool->chain;                                                  \
    pool->chain = cl


/**
 * 释放BUF
 * 1. 如果buf不为空,则不释放
 * 2. 如果cl->buf->tag标记不一样,则直接还给Nginx的pool->chain链表
 * 3. 如果buf为空,并且需要释放,则直接释放buf,并且放到free的空闲列表上
 */
void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free,
		ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag)
{
	ngx_chain_t *cl;

	/* *busy 指向OUT,将已经输出的out放到busy链表上 */
	if (*busy == NULL) {
		*busy = *out;

	} else {
		for (cl = *busy; cl->next; cl = cl->next) { /* void */
		}

		cl->next = *out;
	}

	*out = NULL;

	/* 遍历 busy链表 */
	while (*busy) {
		cl = *busy;

		/* 如果buf不为空,则继续遍历 */
		if (ngx_buf_size(cl->buf) != 0) {
			break;
		}

		/* 如果标识一样,则释放这个BUF */
		if (cl->buf->tag != tag) {
			*busy = cl->next;
			ngx_free_chain(p, cl); //还给Nginx pool->chain
			continue;
		}

		/* 直接将buf使用的部分回归到 起点指针地址 */
		cl->buf->pos = cl->buf->start;
		cl->buf->last = cl->buf->start;

		*busy = cl->next; //继续往后遍历

		/* 并且将cl放到free列表上 */
		cl->next = *free;
		*free = cl;
	}
}

 

单线激光雷达的工作原理 单线激光雷达通过单一激光束的水平扫描和时间 / 相位测量,实现二维环境的距离感知,是低成本二维导航的核心传感器。尽管其无法直接提供三维信息,但其可靠性和经济性使其在消费级和工业级场景中广泛应用。随着技术发展,部分单线雷达通过振动镜或 MEMS 微振镜实现微小角度偏转,可近似模拟多线扫描效果,进一步拓展了应用边界。 阅读详情

相关推荐

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 702

Nginx源码初探之数据结构 - 缓冲区结构

Nginx通过内存池使用内存,需要从内存池中申请资源在缓存使用上。可以对零散的缓冲区碎片进行了统一的管理和再分配,从而提高了缓冲区的利用率。其中最底层的数据结构,就是内存块数据结构和内存块链表数据结构。 1.数据结构 ngx_buf_t是Nginx系统中系统分配内存的基本单位。ngx_buf_t分为三部分,内存块部分,文件部分,元数据,并分别提供了控制机制。也就...

mlydaemon的专栏 636

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

Ngxin--源码分析 缓冲区链表

1.基本数据结构1.基本数据结构在处理 TCP/HTTP 请求时会经常创建多个缓冲区来存放数据, Nginx缓冲区块简单地组织一个单向链表buf: 缓冲区指针next 下一个链表节点。

qq_62309585的博客 741

深度伪造检测实战:轻量级频域特征 pipeline 部署指南

深度伪造检测(deepfake detection)是多媒体内容安全的核心技术,其本质是通过建模生成式篡改在像素与频域留下的微弱异常痕迹。传统端到端大模型虽在标准数据集上表现优异,却因训练域与真实场景失配、计算开销高、缺乏可解释性而难以落地。本文聚焦于工程可复现的实践路径,提出‘人脸定位→频域伪造特征提取(Xception-FCN + Frequency-Aware Masking)→轻量分类决策’三段式解耦架构,兼顾精度、延迟与可解释性。该方案已在边缘设备(Jetson Orin NX)实现单帧<48ms

weixin_33437929的博客 307

手把手教你用LDR9201芯片DIY高性能Type-C耳机转接头(附电路图)

本文详细介绍了基于LDR9201芯片DIY高性能Type-C耳机转接头的完整实战教程。从芯片选型、电路设计、元器件采购到焊接调试,手把手指导如何打造一个免驱兼容、支持高解析度音频且可通过EEPROM深度定制功能的专属转接头。重点解析了LDR9201作为高度集成的USB音频控制器SoC的优势,并提供了核心电路图与配置指南,适合电子爱好者和硬件开发者实践。

jump7的博客 355

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

nginx 缓冲区链表的源码剖析

@Echo· 个人技术笔记 1万+

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

NGINX源码之:ngx_buf&chain

NGINX,ngx_buf相关原理

qq_22351805的博客 775

避坑指南:Qt5.14.2 ARM交叉编译中那些你可能遇到的‘坑’及解决方案

本文深度解析了Qt 5.14.2在ARM架构上进行交叉编译的完整流程与常见难题。重点阐述了如何精准匹配交叉编译器与目标板环境、正确配置sysroot以及使用configure参数的艺术,并针对编译过程中的头文件缺失、链接错误等典型“坑”提供了经过验证的解决方案,旨在帮助开发者成功构建适用于嵌入式设备的Qt运行时库。

weixin_29279101的博客 352

多目标优化AI Agent:增强LLM的复杂决策能力

在人工智能领域,尤其是自然语言处理(NLP)和大语言模型(LLM)的应用中,决策问题往往涉及多个目标的平衡与优化。例如,在智能客服系统中,既要提高客户满意度,又要降低运营成本;在自动驾驶中,既要确保安全,又要追求行驶效率。传统的单目标优化方法难以满足这种复杂场景的需求,因此多目标优化成为了一种必然趋势。AI Agent是一种智能系统,能够通过感知环境、处理信息并采取行动来实现特定目标。它可以是一个软件程序,也可以是一个物理设备。NSGA-II:一种基于群体的多目标优化算法,通过遗传算法的思想进行迭代优化。

AI天才研究院 1300

nginx缓冲区链表chain

nginx接收nginx服务器的http请求包头、包体,以及响应客户端的应答包头、包体都会存放到chain链表缓冲区中。 一、chain链表缓冲区数据结构 //ngx_chain_t链表节点 struct ngx_chain_s { ngx_buf_t *buf; ngx_chain_t *next; };//缓冲区结构 struct ngx_buf_s {

ApeLife技术博客 2564

YOLOv11改进 | 检测头篇 | 利用AFPN辅助YOLOv11检测头进行特征融合识别(全网独家创新)

本文给大家带来的最新改进机制是利用AFPN(渐近特征金字塔网络)来优化检测头,AFPN的核心思想是通过引入一种渐近的特征融合策略,将底层、高层和顶层的特征逐渐整合到目标检测过程中。这种渐近融合方式有助于减小不同层次特征之间的语义差距,提高特征融合效果,使得检测模型能更好地适应不同层次的语义信息。本文在AFPN的结构基础上,为了适配YOLOv11改进AFPN结构,同时将AFPN融合到YOLOv11中(因为AFPN需要四个检测头,我们只有三个,下一篇文章我会出YOLOv11适配AFPN增加小目标检测头)

Snu77的博客 3750

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:Nov 6th, 2014 1.缓冲区链表结构ngx_chain_t和ngx_buf_t ...

weixin_30952103的博客 104

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Nginx基本数据结构(三)——ngx_chain_t、ngx_buf_t

ngx_chain_t Nginx的filter模块用来处理从别的filter和handler模块传递过来的数据。这个传递的过程是以一个链表(ngx_chain_t)的形式。而且数据可能会被多次传递。 struct ngx_chain_s { ngx_buf_t *buf; ngx_chain_t *next; } 相关操作API ngx_chain_t* ngx_alloc_chain_link(ngx_pool_t* pool); //创建一个ngx_chain_t对象,并返回指向对象的指针,

0 error(s) 728

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Nginx 源码学习】Nginx 的缓冲区

文章目录缓冲区结构设计缓冲区设计图创建一个缓冲区分配 chain 节点分配一个 buf 链表合并buf链表从free chain链中获取一个空闲buf回收链表空间 缓冲区结构设计 网络缓冲区的重要性不言而喻,就如高并发下的消息队列一样。 redis的系列里面没有写缓冲区,muduo 的那个缓冲区设计的就挺不错。 缓冲区内存块的数据结构 ngx_buf_t: typedef struct ngx_buf_s ngx_buf_t; /* * Nginx缓冲区 */ struct ngx_buf_s { .

看,未来的博客 2139

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

06Nginx源码分析之缓冲区结构(ngx_buf.c)

概述: 缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。 一 数组结构结构定义 1. 缓冲区内存块的数据结构 ngx_buf_t typedef void * ngx_buf_tag_t; typedef struct ngx_buf_s ngx_buf_t; /** * Nginx缓冲区 */ struct ngx_buf_s { u_char *pos; /* 待处理数据的开始标

weixin_44517656的博客 770

nginx处理post请求之数据转发

上一篇文章分析了nginx在处理post请求时,如何启动upstream这个负载均衡模块。它是一个http框架,由它来调度具体的模块,例如fastcgi, proxyd反向代理等,这些模块负责将来自客户端 的请求包体,请求包体转为与后端服务器通信的格式。本篇文章来分析nginx是如何将已经转换后的报文发给后端服务器。 一、转发请求数据到后端服务器流程 //与后端服务器建立连接,并注册读写事件的

ApeLife技术博客 1万+

菜鸟学习nginx之HTTP body接收(3)

上一篇介绍了,Nginx是如何接收body主体流程,但是我们仍然没有了解到,Nginx是如何保存body的?也就是第一篇中提到的问题。本篇主要分析ngx_http_request_body_filter函数,该函数会帮助我们解决。 一、ngx_http_request_body_t结构体 typedef struct { ngx_temp_file_t ...

程序员的世界 2872

NGINX缓存原理及源码分析(一)

概述 缓存是计算机领域的一种非常重要设计。主要用来提升响应速度。比如计算机系统中的存储体系就是这一经典缓存的实现。它是由寄存器,缓存,内存,磁盘,网络组成的一个层级体系,用来存储各种信息。类比日常生活中,我们对于知识的存储系统也是一个层级的缓存体系。它是由我们的大脑,笔记本,身边朋友,书籍,网络组成的。这些层级系统有一个共同的特点就是层级越高它的容量越小,速度越快但是同时价格也越贵。 在我们使用浏览器获取信息时,也有一个缓存体系在发挥作用。那就是客户端浏览器缓存,中间各级代理设备缓存,服务器缓存,服务器

weixin_42906485的博客 1152

Nginx 限制某 IP 在一段时间内对服务器发起请求的连接数

使用ngx_http_limit_req_module 模块可以限制某一 IP 在一段时间内对服务器发起请求的连接数,该模块为内置模块 (1) 不加burst 和 不加 nodelay Nginx 配置截图: ab压测截图: ab -n 10 -c 10 http://10.129.159.159/ 不加burst 和不加 nodelay 的情况下,rate=1r/s 1 秒钟只能处理 1 个请求,剩余的所有请求都会直接返回 503 (2) 加burst 和 不加 nodelay Nginx配置截图

qq_40907977的博客 690

Nginx源码分析--单个缓冲区

而后者是当前数据块链(ngx_chain_t)里的最后一块,之后可能还会有数据需要处理。从ngx_buf_t的定义可以看到,一个有数据的缓冲区不是在内存里,就是在文件里,所以内存标志位成员变量(temporary/memory/mmap)和文件标志成员变量(in_file/temp_file)不能全为0,否则Nginx 会认为这是个特殊( special)或无效的缓冲区。如果缓冲区既不在内存也不在文件里,那么它就不含有有效数据,只起到控制作用,例如刷新(flush)或者同步(sync)

qq_62309585的博客 546

NGINX源码之:ngx_open_cached_file

NGINX源码解读:ngx_open_cached_file、ngx_pool_cleanup_add、ngx_open_and_stat_file、ngx_open_file_cache_init、ngx_expire_old_cached_files、ngx_open_file_cleanup、ngx_open_file_cache_cleanup

qq_22351805的博客 1347

Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)

目录 一、代码实例 二、初始化绑定阶段处理 三、回调函数写日志 四、编译调试结果 一、代码实例 HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler》 我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。 #include <ngx_config.h> #include <ngx_core.h> #i

alpha_love的博客 291

nginx-模块内存泄露调试

在开发或使用别人模块时,偶尔会出现内存泄露的情况,这个时候在配置文件中配置 worker_processer 1; daemon off; master_process off; 然后使用valgrind调试: valgrind --leak-check=yes --log-file=valgrind_result_leak --trace-children=yes ./nginx 然后出现如下结果: ==29006== 355,213,312 bytes in 86,722 bl

zhangge3663的博客 688

Nginx基础数据结构分析-ngx_buf_t

这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理)。 该数据结构位于src/core/ngx_buf.h|c文件中...

weixin_34218890的博客 241
上一篇: Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03)
下一篇: Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值