Nginx源码分析—架构设计思想

Nginx源码分析—架构设计思想

我任务nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx。

至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩子函数,这里又设计到了nginx结构体的使用,比如所有的模块都是ngx_module_t这个结构体,但是这个结构体中的ctx变量和commands type这三个变量使得各个module的功能又有所不同。将每一个模块都有所归类

对于一个标准的HTTP请求中,nginx框架试图结束完整的HTTP头部,并在接收到完整的HTPP头部后将请求分发到具体的HTTP模块中处理,最常见的即使根据请求的URI(URI在HTTP请求的头部信息中)和ngin.conf里的location配置项的匹配度来决定如何分发。

HTTP模块间数据流的传递,各个模块之间的写通过工作,配置文件中的Location块决定了匹配某种URI的请求将会由相应的HTTP模块处理,因此,运行时HTTP框架会在接收完毕HTTP请求的头部后,将请求的URI与配置文件中的所有location进行匹配,匹配后再根据Location{}内的配置项选择HTTP模块来调用。

对于ngx_moudle_t结构体中的init_module  init_process 函数指针,前者是在初始化所有模块时被调用,后者是在worker进程已经产生时被调用,这两个函数指针之后再ngx_core_event_module模块中实现了这几个调用时和nginx框架相关的,对于一个HTTP模块,NGX_HTTP_MODULE,ngx_module_t中的ctx指向ngx_http_module_t类型的结构体,这个结构体中有8个函数指针,nginx狂a级会在不同的时刻调用这个8个回调来读取重载配置文件。

一个HTTP请求会被许多个配置项控制,实际上这是因为一个HTTP请求可以被许多个HTTP模块同时处理,这样就会有一个先手顺序问题。由于同一个配置项可以从属与许多个server location配置快,那么这个配置项将会针对不同的请求起作用。自己有很大的自由来定义自己的模块如何介入HTTP请求的处理,

可以这么认为,某一个配置项,在不同的层次有不同的作用域,配置项决定了自己感兴趣的HTTP请求。

可以这么理解配置项,配置项是对某一类HTTP请求感兴趣,这个配置项放到某一个配置块内,当某一类HTTP请求到达后进行匹配,根据配置项来判断有哪些模块对自己这个HTTP请求感兴趣,那么系统就进行控制对这个HTTP请求调用这个配置项对应的HTTP模块

对于一个有参数的配置项,在NGINX中定义了14个常用的类型来标识配置项中的参数类型,也有对应的参数来处理这些参数。

http{}块下有一个ngx_http_conf_ctx_t结构,而每一个serve{}块下也有一个ngx_http_conf_ctx_t结构

NGINX源码分析—过滤模块的意义

HTTP框架允许普通的HTTP处理模块介入其中的7个阶段处理请求,但是普通大部分HTTP模块(官方模块或者第三方模块)都只在NGX_HTTP_CONTENT_PHASE阶段处理请求,HTTP模块有两种介入方法,第一种是,任意一个HTTP模块会对所有的用户请求产生作用,第二中方法,只对请求的URI匹配了nginx.conf中某些location表达式下的HTTP模块起作用,大部分模块都使用上述的第二种方法处理请求,这种方法的特点是一种请求仅由一个HTTP模块(在NGX_HTTP_CONTENT_PHASE阶段)处理。如果希望多个HTTP模块共同处理一个请求,则多半是由subrequest功能来完成,即将原始请求分为多个子请求,每个子请求再由一个HTTP模块在NGX_HTTP_CONTENT_PHASE阶段处理。

对于HTTP过滤模块则不同,一个请求可以被任意个HTTP过滤模块处理,因此,普通的HTTP模块更倾向于完成请求的核心功能,如static模块复制静态文件的处理,HTTP过滤模块则处理一些附加的功能,如gzip过滤模块可以把发送给用户的静态文件进行gzip压缩后在发出去,Image_filter这个第三方过滤模块可以将图片类的静态文件制作成缩略图。而且,这些过滤模块的效果是可以根据需要叠加的,比如先由Not_modify过滤模块处理请求中的浏览器缓存信息,再交给range过滤模块处理HTTP
range协议(支持断点续传),然后交由gzip过滤模块进行压缩,一个请求经由各HTTP过滤模块流水线般地依次进行处理了。

在普通HTTP模块处理请求完毕,并调用ngx_http_send_header发送HTTP头部,或者调用ngx_http_output_filter发送HTTP包体时,才会由这两个方法依次调用所有的HTTP过滤模块处理这个请求,因此,HTTP过滤模块仅处理服务器发往客户端的HTTP响应,而不处理客户端发往服务器的HTTP请求

NGINX在进行回应时,分为头部回应和包体回应,那么过滤链表也分为两个部分,对于某一个过滤模块,插入的时候都是插入这个链表的首部,所以,HTTP过滤模块越靠后,在实际执行请求时就越优先执行,以为在初始化HTTP过滤模块式,每一个HTTP过滤模块都是将自己插入到整个单链表的首部。

时间: 2024-10-24 16:28:39

Nginx源码分析—架构设计思想的相关文章

nginx源码分析--框架设计 & master-worker进程模型

Nginx的框架设计-进程模型 在这之前,我们首先澄清几点事实: nginx作为一个高性能服务器的特点,其实这也是所有的高性能服务器的特点,依赖epoll系统调用的高效(高效是相对select/poll这些系统调用的,底层有一个链表和红黑树,避免了轮询,减少了用户空间和系统空间之间的数据传递等),非阻塞(所有的操作都是非阻塞,这样),多进程(master-slave进程模型),这些事实使得nginx成为一个高性能服务器的前提条件. 既然作为一个软件(http服务器),相对于一个网络库而言肯定有更

nginx源码分析--从源码看nginx框架总结

nginx源码总结: 1)代码中没有特别绕特别别扭的编码实现,从变量的定义调用函数的实现封装,都非常恰当,比如从函数命名或者变量命名就可以看出来定义的大体意义,函数的基本功能,再好的架构实现在编码习惯差的人实现也会黯然失色,如果透彻理解代码的实现,领悟架构的设计初衷,觉得每块代码就想经过耐心雕琢一样,不仅仅实现了基本的功能给你,为其他人阅读也会提供很好的支持.细致恰当的命名规则就可以看出作者的功力. 2)更好更高的软件性能体现在架构设计上,好的架构会让软件更加稳定.容易维护.便于扩展.从核心模块

nginx源码分析--进程间通信机制 & 同步机制

Nginx源码分析-进程间通信机制 从nginx的进程模型可以知道,master进程和worker进程需要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号,master进程主要就是监控.接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是阻塞在sigsuspend()函数调用上.Worker进程屏蔽了所有的外部信号,那么Master进程就通过套接字和worker进程通信,worker进程修改全局变量,使得worker进程接受

Nginx源码分析:3张图看懂启动及进程工作原理

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器开发,阅读优秀源代码是一种有效的方式,nginx 是业界知名的高性能 Web 服务器实现,如何有效的阅读及理解 nginx?本文用图解的方式帮助大家来更好的阅读及理解 nginx 关键环节的实现.   陈科,十年行业从业经验,曾在浙江电信.阿里巴巴.华为.五八同城任开发工程及架构师等职,目前负责河狸

Nginx源码分析 - Nginx启动以及IOCP模型

Nginx 源码分析 - Nginx启动以及IOCP模型 版本及平台信息 本文档针对Nginx1.11.7版本,分析Windows下的相关代码,虽然服务器可能用linux更多,但是windows平台下的代码也基本相似 ,另外windows的IOCP完成端口,异步IO模型非常优秀,很值得一看. Nginx启动 曾经有朋友问我,面对一个大项目的源代码,应该从何读起呢?我给他举了一个例子,我们学校大一大二是在紫金港校区,到了 大三搬到玉泉校区,但是大一的时候也会有时候有事情要去玉泉办.偶尔会去玉泉,但

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

nginx源码分析--模块分类

ngx-modules Nginx 主要的模块大致可以分为四类: handler – 协同完成客户端请求的处理.产生响应数据.比如模块, ngx_http_rewrite_module, ngx_http_log_module, ngx_http_static_module. filter – 对 handler 产生的响应数据做各种过滤处理.比如模块, ngx_http_not_modified_filter_module, ngx_http_header_filter_module. ups

nginx源码分析--ngx_http_optimize_servers()函数

这个函数做了连部分工作:1)以端口为入口点 将有用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对端口进行监听 1. 在ngx_http_core_main_conf_t结构体中有一个字段为ports,是一个数组,数组内存放的全是ngx_http_conf_port_t:对于每一个端口信息(ngx_http_conf_port_t),调用 ngx_http_server_names函数,同时也调用ngx_http_init_listening函数,这里

nginx源码分析--nginx外部信号 命令参数

nginx命令行参数 不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置 -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的. -t 不运行,而仅仅测试配置文件.nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件. -v 显示 nginx 的版本. -V 显示 nginx 的版本,编译器版本和配置参数. nginx控制信号 可以使用信号系统来控制主进程.默认,nginx 将其主进程的 pid 写入到 /u