在开始唠叨之前,先简单介绍下配置系统,因为之后的东东会与这个有一定的关系。

一、配置系统

Nginx的配置系统由一个主配置文件和一些辅助配置文件构成,这些配置文件默认在/etc/nginx/目录下。

辅助配置文件只在某些特定情况下才会使用,但主配置文件即nginx.conf是在任何情况下都必须使用的。

在nginx.conf中,包含若干配置项,每个配置项由配置指令和指令参数两部分组成,指令参数即配置指令对应的配置值,可以简单认为配置项是一个Key/Value对。

需要注意的是,配置指令如果包含空格需要用单引号或双引号括起来,指令参数如果是由简单字符串构成的简单配置项则需要以分号结束,如果指令参数是复杂配置项则需要用{}括起来。

nginx.conf中的配置信息,根据其逻辑上的意义对其进行分类,可以分成多个作用域或指令上下文,指令上下文层次关系如下:

main:Nginx在运行时与具体业务功能无关的参数,比如工作进程数、运行身份等。

http:与提供http服务相关的参数,比如keepalive、gzip等。

server:http服务上支持若干虚拟机,每个虚拟机一个对应的server配置项,配置项里包含该虚拟机相关的配置。

location:http服务中,某些特定的URL对应的一系列配置项。

mail: 实现email相关的SMTP/IMAP/POP3代理时,共享的一些配置项。

二、模块体系

Nginx的内部结构是由核心部分和一系列功能模块组成的,这样可以使得每个模块的功能相对简单,便于对系统进行功能扩展,各模块之间的关系如下图:

nginx core实现了底层的通讯协议,为其他模块和Nginx进程构建了基本的运行时环境,并且构建了其他各模块的协作基础。

http模块和mail模块位于nginx core和各功能模块的中间层,这2个模块在nginx core之上实现了另外一层抽象,分别处理与http协议和email相关协议(SMTP/IMAP/POP3)有关的事件,并且确保这些事件能被以正确的顺序调用其它的一些功能模块。

nginx功能模块基本上分为如下几种类型:

(1) event module:搭建了独立于操作系统的事件处理机制的框架,以及提供了各具体事件的处理,包括ngx_event_module、ngx_event_core_module和ngx_epoll_module等,Nginx具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。

(2) phase handler:此类型的模块也被直接称为handler模块,主要负责处理客户端请求并产生待响应内容,比如ngx_http_module模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。

(3) output filter:也称为filter模块,主要是负责对输出的内容进行处理,可以对输出进行修改,比如可以实现对输出的所有html页面增加预定义的footbar一类的工作,或者对输出的图片的URL进行替换之类的工作。

(4) upstream:实现反向代理功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端,upstream模块是一种特殊的handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。

(5) load-balancer:负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

(6) extend module:根据特定业务需要编写的第三方模块。

三、请求处理

下面将会以http请求处理为例来说明请求、配置和模块是如何串起来的。

当Nginx读取到一个HTTP Request的header时,首先查找与这个请求关联的虚拟主机的配置,如果找到了则这个请求会经历以下几个阶段的处理(phase handlers):

NGX_HTTP_POST_READ_PHASE: 读取请求内容阶段

NGX_HTTP_SERVER_REWRITE_PHASE: Server请求地址重写阶段

NGX_HTTP_FIND_CONFIG_PHASE:配置查找阶段

NGX_HTTP_REWRITE_PHASE:Location请求地址重写阶段

NGX_HTTP_POST_REWRITE_PHASE:请求地址重写提交阶段

NGX_HTTP_PREACCESS_PHASE: 访问权限检查准备阶段

NGX_HTTP_ACCESS_PHASE: 访问权限检查阶段

NGX_HTTP_POST_ACCESS_PHASE: 访问权限检查提交阶段

NGX_HTTP_TRY_FILES_PHASE: 内容产生阶段

NGX_HTTP_LOG_PHASE:日志模块处理阶段

在内容产生阶段,为了给一个request产生正确的response,Nginx必须把这个请求交给一个合适的content handler去处理。如果这个request对应的location在配置文件中被明确指定了一个content handler,那么Nginx就可以通过对location的匹配,直接找到这个对应的handler,并把这request交给这个content handler去处理。这样的配置指令包括perl、flv、proxy_pass、mp4等。

如果一个request对应的location并没有直接配置的content handler,那么Nginx依次作如下尝试:

(1) 如果一个location里面有配置random_index on,那么随即选择一个文件发送给客户端。

(2) 如果一个location里面有配置index指令,那么发送index指令指定的文件给客户端。

(3) 如果一个location里面有配置autoindex on,那么就发送请求地址对应的服务端路径下的文件列表给客户端。

(4) 如果这个request对应的location上有设置gzip_static on,那么就查找是否有对应的.gz文件存在,如果有的话,就发送这个客户端(客户端支持gzip的情况下).

(5) 请求的URI如果对应的一个静态文件,static module就发送静态文件的内容到客户端。

内容产生阶段完成以后,生成的输出会被传递到filter模块去进行处理。filter模块也是与location相关的。所有的filter模块都被组织成了一条链。输出会依次穿越所有的filter,直到有一个filter模块的返回值表明已经处理完成。 接下来就可以发送response给客户端了。

Nginx深入详解之模块化体系结构相关推荐

  1. Nginx 架构详解

    Nginx 架构详解 nginx的下篇将会更加深入的介绍nginx的实现原理.上一章,我们了解到了如何设计一个高性能服务器,那这一章将会开始讲解,nginx是如何一步一步实现高性能服务器的. Ngin ...

  2. Nginx Rewrite详解

    Nginx Rewrite详解 引用链接:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 原文如下: 在新主机的迁移过程中,最大的困难就是W ...

  3. 【Google Play】App Bundle 使用详解 ( 应用模块化 )

    Google Play 上架完整流程 系列文章目录 [Google Play]创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 ) [Google Play]创建并设置应用 ( 访 ...

  4. nginx配置详解1

    Nginx 配置文件详解 user nginx ; #用户 worker_processes 8; #工作进程,根据硬件调整,大于等于cpu核数 error_log logs/nginx_error. ...

  5. Nginx配置详解/代理服务的配置说明

    Nginx配置详解 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作 ...

  6. Nginx rewrite 详解

    Nginx rewrite 详解 本篇主要介绍 nginx 的 rewrite 重定向这个功能进行 详解介绍, 以及介绍它的使用场景 1. rewrite 基本介绍 rewrite是实现URL重写的关 ...

  7. 配置nginx方向代理,实现URL隐形转发 (附带nginx配置文件详解)

    配置nginx方向代理,实现URL隐形转发 (附带nginx配置文件详解) 免费领取满减阿里云红包 项目名称:[域名解析–隐形URL转发]–centos 7.3 环境: 阿里云服务器之上有多个tomc ...

  8. 学完Nginx/OpenResty详解,反向代理与负载均衡配置,能涨薪多少

    反向代理与负载均衡配置 接下来介绍Nginx的重要功能:反向代理+负载均衡.单体Nginx的性能虽然不错,但也是有瓶颈的.打个比方:用户请求发起一个请求,网站显示的图片量比较大,如果这个时候有大量用户 ...

  9. 本文来深入学习Nginx/OpenResty详解,Nginx到底是个什么鬼

    Nginx/OpenResty详解 Nginx(或OpenResty)在生产场景中使用的广泛程度已经到了令人咂舌的地步.无论其实际的市场占用率如何,以笔者这些年所经历的项目来看,其使用率为100%. ...

最新文章

  1. angular 注入器配置_angular依赖注入
  2. 在一表中设置组合主键(两个字段组合成一个主键)
  3. 【书评】RHCSA/RHCE Red Hat Linux 认证学习指南(第6版)EX200 EX300
  4. c语言程序设计编程解读,C语言程序设计第三次实验报告解读
  5. php制作留言板的题_PHP实现留言板功能实例代码
  6. 公司内部z区域网络升级可行性方案
  7. C++异常 调用abort()
  8. 人脸对齐(二)--ASM算法
  9. 光流(二)--光流算法
  10. 解题报告 一元三次方程求解
  11. qj71c24n通讯实例_三菱Q系列串行通信模块QJ71C24N概述与特点
  12. alooa是华为什么型号_dubalooa什么型号手机 dubalooa华为手机什么型号 - 云骑士一键重装系统...
  13. SNARK性能及安全——Verifier篇
  14. 简单记录fortran入门过程
  15. awk命令在ps -ef中的应用
  16. 09驾校科目一考试系统——提交分数
  17. SpringBoot项目打jar后执行jar包提示:xx没有主属性清单 解决
  18. 百度网盘无法登陆,二维码不显示,密码、验证码登陆显示‘网络异常’解决方法
  19. 进阶课程⑩ | Apollo地图采集方案
  20. Creo5.0结构有限元仿真分析视频教程

热门文章

  1. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流
  2. shell脚本命令set
  3. 【解析】案例4-1.7 文件传输 (25 分)
  4. 【已解决】navigateTo:fail page “/pages/.../...“ is not found
  5. android文件加解密开发,Android文件加密解密的实现
  6. 580分左右的计算机院校,2021年高考580分可以上什么大学 580分左右的院校
  7. idea2019运行php项目,新版IntelliJ phpstrom IDEA 2019.2版本的使用方法
  8. 交互 点击变色_这个95%的人都没用过的PPT功能,几分钟帮你做出发布会级的交互动画...
  9. assert()函数_【工程师分享】避免Xil_Assert系列宏导致的死循环
  10. JFreeChart相关类中文说明