玖叶教程网

前端编程开发入门

Nginx不归路:架构基础篇(nginx架构原理)

参考文章:http://tengine.taobao.org/book/chapter_02.html

来自savuer大兄dei的一个系列文章,全系列共有四篇文章:

  • Nginx 架构介绍
  • Nginx 基本配置
  • Nginx_upstream
  • Nginx_location

另外给前端小伙伴们,推荐一下他的GitHub,超多实战内容。只需一个star,你会和我一样爱上…

一、nginx的作用

  • webserver
  • 反向代理服务器
  • 负载均衡

二、初探nginx架构

  • 多进程模式
  • 支持手动关闭后台模式,让nginx在前台运行,通过配置取消master进程,使nginx以单进程方式运行
  • nginx启动后,会有一个master进程和多个worker进程
  • master进行主要用来管理worker进程
  • 包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
  • 网络事件放在worker进程中
  • 多个worker进程对等,同等竞争来自客户端的请求,各进程互相之间是独立的
  • 一个请求只能在一个worker进程中处理
  • 一个worker进程不能处理其他进程的请求
  • worker进程数可以设置,一般设置为与机器cpu核数相同
  • nginx -s reloadnginx从容重启:首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出

2.1、nginx进程模型

  • 每个worker进程fork master进程(在master进程完成建立好listen的socket之后)
  • 为保证只有一个worker进程处理这个请求,在worker注册listenfd事件前抢accept_mutex,抢到的注册事件
  • 读事件里调用accept接受该链接,读取请求,解析请求,处理请求,产生数据并返回,断开连接
  • 该模型好处
  • 独立进程不加锁,省事
  • 相互之间不影响,服务不中断
  • 处理事件
  • 异步非阻塞方式处理进程
  • 非阻塞:事件没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没
  • 事件的三种类型:网络事件、信号、定时器

三、nginx基础概念

3.1、connection

  • 一个nginx的最大连接数 worker_connections * worker_processes
  • 对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes
  • HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2 (客户端的链接和后端服务的链接)
  • accept_mutex 选项:获得了accept_mutex的进程才会去添加accept事件
  • 控制进程是否添加accept时间
  • 避免有的进程有空闲链接,没有处理机会,有的进程没有空闲链接,链接被丢弃
  • `ngx_accept_disabled`的变量来控制是否去竞争`accept_mutex`锁

3.2、request

nginx处理网络请求的生命周期

  • ngx_http_request_t是对一个http请求的封装,用来保存解析请求与输出响应相关的数据
  • 从ngx_http_init_request开始,这个函数设置读事件ngx_http_process_request_line来处理请求行,通过ngx_http_read_request_header来处理请求头
  • 以请求行中的host域来查找虚拟机
  • 解析到的数据会存储在ngx_http_request_t结构中
  • nginx解析到两个回车换行符表示请求头结束,调用ngx_http_process_request来处理请求
  • ngx_http_process_request设置处理函数为ngx_http_request_handler
  • 然后调用ngx_http_handler来真正地处理一个完整的HTTP请求

3.3、keepalive

  • 除了http1.0不带content-length以及http1.1非chunked不带content-length外,body的长度是可知的
  • 客户端的请求头中的connection为close,则表示客户端需要关掉长连接
  • 如果为keep-alive,则客户端需要打开长连接
  • 如果客户端的请求中没有connection这个头,那么根据协议,如果是http1.0,则默认为close,如果是http1.1,则默认为keep-alive
  • 如果服务端最后决定keepalive打开,响应头中会包含connection:keep-alive,否则就是connection:close
  • keepalive开启的好处:客户端一次访问需要多次访问同一个server时,会减少大量time-wait的数量

3.4、pipe

  • pipeline流水线作业,是keepalive的一种升华
  • 与keepalive相同也是基于长连接
  • 利用一个连接做多次请求
  • 与keepalive的区别
  • keepalive:第二个请求必须等到第一个请求的响应接受完全后才能发起
  • pipeline:nginx对pipeline中的多个请求处理不是并行的,依然一个请求一个请求的处理,只是在处理第一个请求的时候,客户端就可以发起第二个请求
  • 实现原理:nginx读取数据时,会将读取的数据放到一个buffer里,,处理完前一个请求后,如果发现buffer里还有数据,就会认为是下一个请求的开始,然后处理下一个请求,否则设置keepalive

3.5、lingering_close

  • 延迟关闭,当nginx关闭连接时,先关闭tcp的写,等待一段时间再关闭连接的读
  • 保持更好的客户端兼容性。需要消耗更多的额外资源(比如连接会被一直占用)

四、nginx的配置系统

  • 由一个主配置文件和其他一些辅助配置文件构成
  • 这些文件都是纯文本文件
  • 全部位于nginx安装目录的conf目录下
  • 只有主配置文件nginx.conf是在任何情况下都会被使用
  • nginx.conf中,若干配置项由配置指令和指令参数两个部分构成

4.1、指令

  • 配置指令是一个字符串
  • 可以用单引号或者双引号括起来,也可以不
  • 如果配置指令包含空格,一定要引起来。

4.2、指令参数

  • 指令参数使用一个或多个空格或者TAB字符与指令隔开
  • 指令参数有一个或多个TOKEN串组成,TOKEN串之间由空格或者TAB键分隔
  • 简单配置项:error_page 500 502 503 504 /50x.html;
  • 复杂配置项:
location / {
 root /home/jizhao/nginx-book/build/html;
 index index.html index.htm;
}

4.3、指令上下文

  • nginx.conf中的配置信息根据逻辑上的意义,进行分类,分成了多个作用域(配置指令上下文)
  • 不同的作用域含有一个或者多个配置项
  • nginx支持的几个指令上下文

五、nginx的模块化体系结构

  • nginx的内部结构是由核心部分和一系列的功能模块所组成
  • 好处:使每个模块的功能相对简单,便于开发,同时便于对系统进行功能扩展

5.1、模块概述

  • 将各功能模块组织成一个链,有请求到达时,请求依次经过这条链上的部分或者全部模块,进行处理。
  • 有两个模块比较特殊,他们居于nginx core和各功能模块的中间。这两个模块就是http模块和mail模块。
  • http模块和mail模块在nginx core之上实现了另外一层抽象,处理与HTTP协议和email相关协议(SMTP/POP3/IMAP)有关的事件,并且确保这些事件能被以正确的顺序调用其他的一些功能模块

5.2、模块的分类

5.3、请求的处理流程

  • 初始化HTTP Request(读取来自客户端的数据,生成HTTP Request对象,该对象含有该请求所有的信息)
  • 处理请求头
  • 处理请求体
  • 如果有的话,调用与此请求(URL或者Location)关联的handler
  • 依次调用各phase handler进行处理
  • 通常情况下,一个phase handler对这个request进行处理,并产生一些输出。通常phase handler是与定义在配置文件中的某个location相关联的
  • 一个phase handler通常执行以下几项任务:
  • 获取location配置
  • 产生适当的响应
  • 发送response header
  • 发送response body

尾声

Nginx第一炮已经打响,搞起来吧~~~

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言