
Nginx
文章平均质量分 85
xxb249
电脑爱好者,半个电脑程序员
展开
-
菜鸟学习Nginx之ngx_buf_t
上一篇介绍的是ngx_pool_t内存池,对于Nginx来说万物皆池化,接下来介绍的ngx_buf_t也是从内存池中获取内存空间。一、数据结构定义1.1、数据结构定义ngx_buf_t从名字上可知,是缓冲区的意思。与大多数开源软件定义的缓冲区有点不同,它不仅仅能够处理内存,还能够处理文件,输入结构如下:typedef void * ngx_buf_tag_t...原创 2018-12-13 11:09:32 · 2530 阅读 · 0 评论 -
菜鸟学习nginx之接收HTTP Header
上一篇介绍了《菜鸟学习nginx之接收HTTP请求行》,本篇介绍Nginx接收HTTP Header处理流程。一、HTTP Header处理流程处理Header与上一篇处理HTTP请求行很类似,比较容易理解1.1、流程图1.2、代码/** * 处理HTTP Header * @param rev 读事件 */static voidngx_http_process...原创 2019-01-09 08:52:03 · 5774 阅读 · 0 评论 -
菜鸟学习nginx之HTTP请求处理(1)
上一篇主要介绍Nginx是如何处理HTTP Header。由于HTTP请求处理这部分代码是Nginx核心内容,打算用两篇文章深入介绍。本篇先介绍HTTP处理的11个阶段。一、HTTP处理11阶段1.1、为什么要有11阶段?这个得从Nginx设计出发。首先Nginx是单线程且完全异步框架,Nginx把所有功能都统一抽象成模块,即“万物皆模块”。每个模块仅仅完成一个独立、简单的功能(说白点...原创 2019-01-10 08:35:39 · 1421 阅读 · 0 评论 -
菜鸟学习nginx之HTTP body接收(1)
上一篇介绍了Nginx是如何处理HTTP请求的,其实对于一个真正的HTTP请求,往往是有body的,只有处理完body才算真正处理完该请求。对于HTTP body来说一般处理有两种方式,要么是丢弃body,要么是接收body。对于接收body面临比较大的挑战,因为body是不定长,我们无法预先分配内存来接收body。况且http body可能很大,例如都上传一个高清电影,可能就有几个G大小。直...原创 2019-01-13 15:29:11 · 2546 阅读 · 0 评论 -
菜鸟学习nginx之HTTP body接收(2)
上一篇介绍Nginx是如何丢弃body,虽然是丢弃body但是仍然需要乖乖的从socket缓冲区中读取报文才行。本篇将介绍实际接收流程。一、概要接收流程是比较复杂的,主要涉及到两个方面考虑:body过长如何保存以及一次接收不完body应该如何设置下次接收。Nginx采用如下方式解决上述问题:1、如果一个buffer缓冲区不能够容纳body,则会把body写入到临时文件中。2、如果一...原创 2019-01-13 15:29:20 · 4510 阅读 · 0 评论 -
菜鸟学习Nginx之定时器
今天来分析一下Nginx定时器实现原理。一、Nginx定时器在网络通信中,客户端给服务端发送一个请求,如果服务端一直没有响应,那么客户端是不能一直傻傻的等待的,一般情况下,客户端需要设置一个超时定时器,当定时器超时后客户端需要进行后续处理。Nginx定期器常用在upstream、子请求中,这些在分析http模块时已经介绍。二、定时器实现2.1 定时器Nginx中定时器事件是...原创 2019-01-15 23:08:28 · 1011 阅读 · 0 评论 -
菜鸟学习nginx之模块定义
今天开始介绍Nginx框架相关内容。Nginx将所有功能进行模块化区分,按照功能统一编排,例如:事件模块,HTTP模块,邮箱模块,配置文件模块等。对于复杂模块,又支持子模块定义,例如HTTP模块中有ngx_http_header_filter_module等。Nginx为这些模块都进行统一的封装,保证接口的统一化。接下来我们来学习一下Nginx优良设计。一、Nginx架构我们先来看一下...原创 2018-12-26 22:24:39 · 779 阅读 · 0 评论 -
菜鸟学习nginx之HTTP body接收(3)
上一篇介绍了,Nginx是如何接收body主体流程,但是我们仍然没有了解到,Nginx是如何保存body的?也就是第一篇中提到的问题。本篇主要分析ngx_http_request_body_filter函数,该函数会帮助我们解决。一、ngx_http_request_body_t结构体typedef struct { ngx_temp_file_t ...原创 2019-01-13 15:29:26 · 2634 阅读 · 4 评论 -
菜鸟学习Nginx之HTTP会话
从本篇开始,介绍Nginx中HTTP相关。Nginx做为Web Server那么HTTP必然是重中之重。本篇不打算介绍太深入,本篇最主要内容是如何与事件驱动关联起来。一、监听端口Nginx默认监听端口是80端口,那么Nginx是如何将80端口的listening事件注册到事件驱动(epoll)中呢?这里简单回顾一下,具体内容可参考《菜鸟学习nginx之核心模块ngx_events_modu...原创 2019-01-07 10:35:41 · 689 阅读 · 0 评论 -
菜鸟学习nginx之HTTP请求处理(2)
在上一篇介绍了Nginx定义的11个阶段,本篇将深入介绍Nginx是如何处理HTTP请求的。一、ngx_http_process_request/** * 处理HTTP请求 * @param r HTTP请求 * 当成功接收到请求行和Header时 就可以处理HTTP请求流程 * 至于是否存在body 则在后续流程中处理 */void ngx_http_process_req...原创 2019-01-10 08:36:25 · 1145 阅读 · 0 评论 -
菜鸟学习nginx之发送HTTP响应
上一篇介绍了Nginx接收HTTP body流程,今天介绍Nginx发送HTTP响应流程。一、发送HTTP Response header发送响应需要设置两部分内容,Response header和Response body(若有)。这里介绍一下发送的header函数。1.1、存储结构发送HTTP响应行、HTTP响应头保存的数据结构在,ngx_http_request_t中head...原创 2019-01-14 18:47:41 · 1611 阅读 · 0 评论 -
菜鸟学习nginx之结束HTTP请求
当我们发送响应的时候,意味着我们即将结束当前HTTP请求,注意这里并不是关闭TCP连接,因此TCP连接可能正用在其他请求上。Nginx定义了很多接口用关闭HTTP请求,但用的最多还是ngx_http_finalize_request。接下来分析一下它。一、Nginx管理HTTP核心思想众所周知,Nginx全异步框架,当一个流程可能需要较长时间占用进程,那么Nginx建议派生出子请求(sub...原创 2019-01-15 09:56:17 · 4204 阅读 · 0 评论 -
菜鸟学习nginx之接收HTTP请求行
上一篇介绍了HTTP会话建立流程,本篇介绍接收HTTP Header流程。由于Nginx是完全异步的,这对编写HTTP框架提出比较高的要求,因此Nginx在实现HTTP框架时定义出11个阶段。后续章节会详细介绍该11阶段。本篇介绍的接收HTTP Header请求在HTTP框架中是逻辑比较简单。HTTP协议本身虽然比较简单,但是对于解析HTTP协议并不是很容易。体现之处就是HTTP协议heade...原创 2019-01-08 15:22:52 · 2047 阅读 · 0 评论 -
菜鸟学习Nginx之启动流程(1)
对于C语言编写的程序来说,main函数就是入口函数,把main函数研究清楚对于理解软件架构、功能会有事半功倍的效果。好在Nginx的main函数并不是很复杂,这里会把启动流程分成两篇来介绍,希望能够描述清楚。我把启动流程划分成两部分:cycle核心结构体初始化、master/worker进程启动。本篇介绍cycle核心结构体初始化。一、初始化流程在Nginx中有一个结构体伴随Nginx...原创 2018-12-05 21:42:08 · 1174 阅读 · 0 评论 -
菜鸟学习Nginx之ngx_list_t
上一篇介绍的是ngx_buf_t,本篇介绍ngx_list_t,几乎在Nginx中无处不在,出现频率非常之高。Nginx中ngx_list_t在名字是链表的含义,但是实际可以理解成是数组形式单链表,比一般的链表要复杂一些,而ngx_queue_t是我们常说的双向链表。这一点需要澄清。一、数据结构1.1、数据结构typedef struct ngx_list_part_s ngx...原创 2018-12-18 17:00:02 · 1054 阅读 · 0 评论 -
菜鸟学习Nginx之内存池
从今天开始深入介绍Nginx框架。首先来谈谈我对《深入理解Nginx模块开发与架构解析》看法,这本书应该是到目前为止,市面写的最详细,最充实的书籍(没有之一),值得拥有。然而此书对于一个小白来说,并不太适合,此书适合有相关使用经验或者开发经验,适合于进一步深造的同学。如果是小白,建议先浏览一下网上的博客,对Nginx各个方面有一定了解,然后在深入阅读此书。这是仅仅是我个人经验,毕竟我是这样走过...原创 2018-12-10 16:47:08 · 602 阅读 · 0 评论 -
菜鸟学习Nginx之ngx_array_t
在上一篇介绍了ngx_list_t,本篇介绍一下ngx_array_t,其实有了上一篇的基础,在介绍ngx_array_t就比较简单了。一、数据结构在数据结构上与ngx_list_t有一点点重复,如下所示:typedef struct { void *elts; /* 数组的起始地址 */ ngx_uint_t nelts; /* 当前数组已存储元素...原创 2018-12-25 16:11:30 · 497 阅读 · 0 评论 -
菜鸟学习Nginx之入门开发留言板
本篇算是学习Nginx开山之作,后面还有会具体解析源码。利用Nginx实现了一个登录、留言板、文件上传功能,功能非常简单。但是对于如何开发一个Nginx模块来说已经足够,希望能够起到抛砖引玉的效果。一、效果登录界面:http://192.168.1.10/login.html 用户名和密码随意首页:http://192.168.1.10/index.html文件...原创 2018-12-04 13:30:34 · 697 阅读 · 0 评论 -
菜鸟学习Nginx之平滑升级
Nginx高可用、高可靠性体现它的平滑升级--在升级过程中能够保证业务不间断,那它是如何实现的呢?接下来我们一起探讨它的实现原理。一、升级过程1.1、查看进程信息先通过命令行感性的了解一下Nginx是如何进行平滑升级的?首先通过命令行查看进程信息,可知,一个master进程、两个worker进程,如下所示:[root@localhost ~]# ps -ef | grep ngi...原创 2019-01-17 23:06:00 · 747 阅读 · 0 评论 -
菜鸟学习Nginx之启动流程(2)
上一篇介绍了启动流程中关于初始化ngx_cycle_t。由于ngx_cycle_t是Nginx核心结构,Nginx整个架构均是围绕它构建起来的。虽然用了一整篇文章介绍ngx_cycle_t,但是感觉还是有些内容没有介绍清楚。初始化ngx_cycle_t有一部分代码没有介绍,ngx_conf_parse,该函数解析配置文件nginx.conf函数。此函数就是单纯解析配置文件,里面代码比较枯燥乏味,理...原创 2018-12-06 19:59:19 · 462 阅读 · 0 评论 -
菜鸟学习nginx之核心模块ngx_events_module
既然Nginx是HTTP服务端软件,那么必然离不开网络。今天就介绍Nginx高性能网络是如何实现的。一、核心模块-ngx_events_module (校长)上一篇中介绍了Nginx模块抽象,今天深入探讨一下ngx_event_module事件模块。1.1、模块定义/** * 模块定义--事件模块 */ngx_module_t ngx_events_module = { ...原创 2018-12-29 11:26:17 · 1086 阅读 · 0 评论 -
菜鸟学习Nginx之启动流程(3)
由于上一篇《菜鸟学习Nginx之启动流程(2)》篇幅比较长,因此特地在写一篇。而本篇将是启动流程中最后一篇,主要介绍worker进程主函数。一、ngx_worker_process_cycleworker进程主函数,内容并不是很多,但若是展开说明则将会把整个Nginx框架都牵扯进来。所以这里不会展开说明,后续文章将会深入探讨。/** * 子进程 进程main函数 */stati...原创 2018-12-07 13:33:19 · 322 阅读 · 0 评论 -
菜鸟学习nginx之事件模块epoll(1)
上一篇介绍核心事件模块,本篇介绍事件模块ngx_epoll_module。Nginx在linux环境下采用epoll网络模型,对于epoll网络型不了解的可自行百度查询,本篇不在阐述。一、问题本篇要澄清以下几个问题:1、当客户端发起TCP连接后,事件模块是如何管理新连接?2、Nginx是如何接收到客户端请求(只是TCP层请求非HTTP请求)?3、Nginx是如何发送响应给客户端...原创 2019-01-01 16:19:04 · 1425 阅读 · 0 评论 -
菜鸟学习nginx之事件模块epoll(2)
上一篇介绍的内容是ngx_epoll_module模块初始化、关闭以及核心内容事件循环。但是具体如何将事件注册到事件驱动中呢?nginx对其进行了封装,ngx_add_event/ngx_del_event。然而上层应用模块,例如HTTP模块并不直接使用这两个接口,而是使用再次封装函数ngx_handle_read_event/ngx_handle_write_event。一、ngx_add_...原创 2019-01-02 19:38:35 · 583 阅读 · 0 评论 -
菜鸟学习nginx之惊群处理
“惊群”这个名词是我阅读Nginx时第一次接触到的,也算是学到了一点点知识吧。一、惊群1.1、惊群定义对于惊群的概念简单描述一下:通常场景一个端口P1只能被一个进程A监听,所以端口P1发的事件都会被该进程A所处理。但是,如果进程A通过系统调用fork(),创建子进程B,那么进程B也能够监听端口P1。这样就可以实现多进程监听同一个端口并且进入阻塞状态。这样就引发了一个问题,当客户端发起T...原创 2019-01-05 15:21:00 · 767 阅读 · 1 评论 -
菜鸟学习nginx之总结杂耍
本篇是对Nginx学习最后一篇,若日后工作中对Nginx有了更深入了解,会再次写相关博客。一、关于Nginx几个典型问题1.1、为什么Nginx是高性能HTTP?是如何做到高性能?这种问题比较广,往往出现在面试过程中,比如说阿里、腾讯的人,他们就比较喜欢问这种问题。这种问题让谁说都可能比较头疼,下面是我自己的理解:1.优异框架,采用全异步方式2.优秀数据结构,例如内存池,字符串...原创 2019-01-17 23:06:54 · 267 阅读 · 0 评论