读了前言《Nginx开发从入门到精通》

nginx 在工作中作为接入层的使用是已经相当常见了,但是一直是停留在会初步使用的阶段。在挺久之前就看到来 标题中提到的这本书,很想读读去了解一下 nginx 的工作原理。总算是趁着假期,有整块的时间来 看完,读书的节奏一样是翻书,留存率 20%


20% 都没到,只是看了楚天架构的部分,后面模块编写的部分超出来实际上的使用场景

这本书是淘宝团队写的,下面给出这本书的链接:

平台初探

这一章节里面讲了基本架构,数据结构基本配置,以及模块化体系的请求流程。

数据结构的部分,看了下但是不是重点,因为没有对应的开发需求。

为什么使用 nginx 换 apache

看完初章,可以有这几个答案:

  1. apach 使用的是多线程的模型,每一个请求会产生一个线程,在并发上千的时候,就已经有上千和线程来十分的消耗资源。
  2. 线程的运行,存在频繁的上下文切换,导致资源消耗量很大。
  3. nginx 实际上处理任务的就只有 几个 worker 进程,所有的请求使用 异步非阻塞的形式来进行监听。使用 epoll 来对建立的套接字文件来进行监听如果有变化,就进行处理。没有频繁的上下文切换。

nginx 使用的是进程一主多从异步非阻塞模型

Connection

Nginx 的主进程来创建监听相应端口的Socketfb,之后fork出子进程来竞争 accept 建立的新的连接,建连成功之后建立 自有的结构体 ngx_connection_t 来保存连接。

这里nignx的最大连接数是需要主注意的不是 ulimit -n 因为这个是系统limit里面的单个进程最大的文件fb数,但由于 nginx 的多进程 的模型,实际上的最大连接数是 进程数 × fb_max

另外,由于是多个进程的竞争连接,为了实现多个进程之间的连接句柄平衡。在 竞争逻辑里面有这样的逻辑,计算当前进程的建连数和总连接数的比较。如该其值超过,会置位一个 ngx_accept_disabled 的值来避免该进程进行建立新连接。

request

Connect 是在4层的逻辑,这里的request 到了7曾,在request 里面,http 请求传输之后开始进行行解析。

按行来处理,先对请求头来进行解析。之后使用 map 的结果来存储解析结果,以便与配置中的规则匹配来进行特殊处理。

请求内容北存放在缓冲区中,在行读取到两个连续的回车之后,意味着请求头的结束。之后会使用请求处理的函数来进行处理,会区分是读操作还是写操作,使用不同的handle 函数来进行处理。

worker 进程

worker进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

  1. 操作系统提供的机制(例如epoll, kqueue等)产生相关的事件。
  2. 接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
  3. 处理request的header和body。
  4. 产生响应,并发送回客户端。
  5. 完成request的处理。
  6. 重新初始化定时器及其他事件。

请求处理流程 Link

一个 http 请求到nginx 的服务器之后,有一下几个阶段。

  1. 初始化http request 建立对象
  2. 处理请求头 (解析)
  3. 处理请求体
  4. 调用和请求(url/location)关联的handler
  5. 依次调用各个phase handler 来处理

重点就是在这里的phase handler,如该访问一个静态的文件,在磁盘上读取文件一样是phase handler 的作用。

留下点什么吧