![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Nginx
文章平均质量分 84
Nestler
这个作者很懒,什么都没留下…
展开
-
【Nginx】事件驱动框架处理流程
ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化。其中包括将“请求连接”这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epoll模块中。当有新连接事件发生时,ngx_event_accept就会被调用。大致流程是这样:worker进程在ngx_worker原创 2014-07-14 21:11:31 · 2715 阅读 · 1 评论 -
【Nginx】如何处理HTTP配置
同一个配置项可以同时出现多个块内,例如HTTP块、server块、location块。一个配置项到底是取哪个块中的值完全有我们定义的模块决定。处理HTTP配置项分以下4个步骤:创建数据结构用于存储配置项对应的参数设定配置项在配置文件中出现时的限制条件与回调方法实现上述回调方法,或使用Nginx预设的14个回调方法合并不同级别的同名配置项1、分配用于保存配置参数的数据结构原创 2014-06-21 22:18:33 · 1796 阅读 · 0 评论 -
【Nginx】ngx_event_core_module模块
ngx_event_core_module模块属于事件模块,它是其它事件类模块的基础。它主要完成以下任务:创建连接池决定使用哪些事件驱动机制初始化将要使用的事件模块下面分析该模块的代码。ngx_event_core_module的ngx_command_t数组定义如下:/* ngx_event_core_module对7个配置项感兴趣 */static ngx原创 2014-07-10 20:36:56 · 1707 阅读 · 0 评论 -
【Nginx】HTTP框架概述
HTTP框架的首要任务就是通过调用原创 2014-06-13 20:47:33 · 1552 阅读 · 0 评论 -
【Nginx】核心模块ngx_events_module
核心模块ngx_events_module是一个专门用于管理事件模块的模块。它的实现很简单,下面是该模块的定义:ngx_module_t ngx_events_module = { NGX_MODULE_V1, &ngx_events_module_ctx, /* module context */ ngx_events_comman原创 2014-07-09 20:47:46 · 2167 阅读 · 0 评论 -
【Nginx】将磁盘文件作文包体发送
接上一篇文章,当Nginx以文件作为用户的请求时,它不会把文件内容读入内存,然后再从内存发送出去,而是会调用sendfile系统调用在不经过用户空间的情况下,从内核直接发送出去。这样做显然效率要更高,Nginx也为我们封装好了一系列的接口,下面就来说明如何发送一个磁盘文件给客户端。和从内存直接发送数据最大的不同在于ngx_buf_t缓冲区的设置方法,ngx_buf_t结构体的定义如下:原创 2014-06-18 22:00:33 · 2218 阅读 · 0 评论 -
【Nginx】开发一个简单的HTTP模块
首先来分析一下HTTP模块是如何介入Nginx的。当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块:for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... }原创 2014-06-17 21:56:07 · 5774 阅读 · 1 评论 -
【Nginx】事件和连接
不同的操作系统对应不同的事件驱动机制,在Linux 2.6之后使用epoll机制,对应的事件驱动模块是ngx_epoll_module。Nginx的ngx_event_core_module模块根据操作系统确定使用哪一个事件驱动模块。事件驱动模块在ngx_module_t的ctx通用接口是ngx_event_module_t,定义如下所示:typedef struct { ngx_st原创 2014-07-08 20:12:45 · 2377 阅读 · 0 评论 -
【Nginx】启动流程
本流程从启动应用程序后的main函数开始跟踪。解析命令行参数并保存到ngx_cycle_t结构体中,在ngx_process_options函数中将保存配置文件路径。调用ngx_add_inherited_sockets函数获取环境变量中关于平滑升级的一些信息。平滑升级时,旧的master进程会通过环境变量发送传递一些信息给新的master进程,新的master进程启动后要原创 2014-07-05 21:02:45 · 1724 阅读 · 0 评论 -
【Nginx】事件驱动框架和异步处理
Nginx对请求的处理是通过事件触发的,模块作为事件消费者,只能被事件收集、分发器调用。这与传统的Web服务器是不同的。传统的Web服务器下,一个请求由一个进程消费,请求在建立连接后将始终占用着系统资源,直到连接关闭才会释放资源。这样做有以下缺点:进程数增加会增加进程间切换的负担,影响系统整体性能。当某个进程要等待事件发生而处于阻塞状态时,该进程仍然占用内存资源直到该请求结束,造成资源原创 2014-07-04 20:52:22 · 3104 阅读 · 0 评论 -
【Nginx】模块化设计
高度模块化的设计是Nginx的架构基础。所有模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法,它们负责模块的初始化和退出。commands成员是一个包含有ngx_command_t结构体的数组,ngx_command_t的作用就是解析配置项。ctx是一个void指针,这使得模块具有高度灵活性。ctx可以指向不同类型模块的通用接口,官方Nginx共有5大类模块原创 2014-07-04 14:00:33 · 2311 阅读 · 0 评论 -
【Nginx】HTTP请求的11个处理阶段
Nginx将一个HTTP请求分成多个阶段,以模块为单位进行处理。这样做的好处是使处理过程更加灵活、降低耦合度。HTTP框架将处理分成了11个阶段,各个阶段以流水线的方式处理请求。这11个HTTP阶段如下所示:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, // 接收到完整的HTTP头部后处理的阶段 NGX_HTTP_SERVER原创 2014-06-14 21:41:31 · 8458 阅读 · 0 评论 -
【Nginx】开发一个HTTP过滤模块
与HTTP处理模块不同,HTTP过滤模块的工作是对发送给用户的HTTP响应做一些加工。服务器返回的一个响应可以被任意多个HTTP过滤模块以流水线的方式依次处理。HTTP响应分为头部和包体,ngx_http_send_header和ngx_http_output_filter函数分别负责发送头部和包体,它们会依次调用各个过滤模块对待发送的响应进行处理。HTTP过滤模块可以单独处理响应的头原创 2014-07-03 15:26:43 · 6310 阅读 · 0 评论 -
【Nginx】监听端口的管理
监听端口属于server虚拟主机,由server{}块内的listen配置项决定。在处理配置文件http块内main级别的配置项时,每个HTTP模块都会调用create_main_conf、create_srv_conf、create_loc_conf三个方法建立三个结构体,用来分别存储http块、server块、location块内的配置项。ngx_http_core_module是原创 2014-06-14 19:46:00 · 7380 阅读 · 0 评论 -
【Nginx】HTTP配置模型
当Nginx检测到配置文件中存在配置块http{}时,会建立一个ngx_http_conf_ctx_t结构体,该结构体定义如下:typedef struct { void **main_conf; // 每个指针元素指向所有由HTTP模块的create_main_conf方法产生的结构体 void **srv_conf; // 每个指针原创 2014-06-24 19:20:00 · 1741 阅读 · 0 评论 -
【Nginx】epoll事件驱动模块
Linux 2.4版本的内核之前,Nginx的事件驱动方式是使用的poll、select函数。进程需要等待连接上有事件发生(收到数据)时,需要把所有连接都告诉内核,由内核找出哪些连接上有事件发生。由于需要把大量连接从用户空间拷贝到内核空间,所以开销巨大,因此,使用poll、select事件驱动方式,最大并发数量只能达到几千。Linux 2.6版本之后添加了epoll函数接口,使得最大并发数量可以达原创 2014-07-12 20:55:47 · 3169 阅读 · 0 评论