美文网首页
Nginx原理读书笔记

Nginx原理读书笔记

作者: 十年磨一剑1111 | 来源:发表于2020-06-09 16:27 被阅读0次

    一. Nginx 简介

    nginx 是一款自由的、开源的、高性能的HTTP服务器和方向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡。

    二. Nginx三个应用场景

    1、静态资源服务(通过本地文件系统提供服务)
    2、缓存、负载均衡服务器
    3、API服务

    三. 为什么选择nginx?

    1. 更快
      这表现在两个方面,一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快的响应请求
    2. 高扩展性
      Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成,。。
    3. 高可靠性
      Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性。
    4. 低内存消耗
      一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
    5. 单机支持10万以上的并发连接
    6. 热部署
      master管理进程与worker工作进程的分离设计,使得worker能够提供热部署功能,在7X24小时不间断服务的前提下,升级worker的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等。
    7. 最自由的BSD许可协议
      这是worker可以快速发展的强大动力。

    四. Nginx相关的开源版本

    Tengine 、open resty

    五. Nginx 高效的原因及原理解析

    先来看下服务器的网络服务模型
    web服务器和客户端是一对多的关系,Web服务器必须有能力同时为多个客户端提供服务,一般来说完成并行处理请求工作有三种方式:
    1. 单进程阻塞的网络模型
    a. 创建一个socket,绑定服务器端口(bind),监听端口(listen),在PHP中用stream_socket_server一个函数可以完成上面三个步骤。
    b. 进入while循环,阻塞在accept操作上,等待客户端的连接进入。此时程序会进入休眠状态,直到有新的客户端发起connect到服务器,操作系统会唤醒此进程。accept函数返回客户端连接的socket。
    c. 利用fread读取客户端socket当中的数据,收到数据后服务器程序进行处理然后使用fwrite向客户端发送响应。长连接的服务会持续与客户端交互。
    缺点:
    一次只能处理一个连接,不支持多个长连接同时处理。
    2. 多进程的方式
    是指,服务器每当收到一个客户端请求时,就有服务器主进程生成一个子进程出来和客户端建立连接进行交互,直到连接断开该子进程就结束了。
    说明:
    程序启动后会创建N个进程。每个子进程进入Accept,等待新的连接进入。当客户端连接服务器时,其中一个子进程会被唤醒,开始出来客户端请求,并且不再接受新的TCP连接。
    多进程的方式的优点是设计简单,各个子进程相对独立,处理客户端请求时彼此不干扰;
    缺点:
    操作系统生成一个子进程需要内存复制等操作,在资源和时间上会产生一定的开销,当有大量请求时,会导致系统性能下降;
    例如: 即时聊天程序,一台服务器可能要维持数十万的连接,那么就要启动数十万的进程来维持,这显然是不可能的。
    3. 多线程的方式
    多线程的方式是指每当接收到一个请求后,会由服务器主进程派生出一个线程出来和客户端进行交互。由于操作系统产生出一个线程的开销远远小于一个进程的开销,故多个线程的方式很大程度上减轻了Web服务器对系统资源的要求。
    缺点:不够稳定,假设某个进程突然关闭会造成整个进程中的所有线程都崩溃。

    4. 单进程IO复用方式
    说明:
    1) 保存所有的socket,通过select模型,监听socket描述符的可读事件
    2) Select会在内核空间监听,一旦发现socket可读,会从内核空间传递至用户空间,在用户空间通过逻辑判断是服务器socket可读还是客户端的socket可读。
    3) 如果是服务端的socket可读,说明有新的客户端建立,将socket保留到监听数组当中
    4) 如果是客户端的socket可读,说明当前已经可以去读取客户端发送过来的内容了,通过fread读取socket内容,然后fwrite响应给客户端。
    优点: 性能最好,一个进程或线程处理多个请求,不需要额外的开销,性能最好,资源占用最低。
    缺点:稳定性不好,某个进程或线程出错,可能导致大量的请求无法处理,甚至导致整个服务宕机,单进程对于大量任务处理乏力。
    5.多进程的master-worker IO复用方式
    1) Nginx启动后,会产出一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程。
    2) 在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到Web请求通过代理转发到后端服务器,又后端服务器进行数据处理和组织;
    3)Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问。
    nginx缓存:基于Proxy Store实现,使用Nginx的http_proxy 模块可以实现类型于squid的缓存功能。当启用缓存时,Nginx会将相应的数据保存在磁盘缓存中,只要缓存数据尚未过期,就会使用缓存数据来响应客户端的请求。
    master 进程主要用来管理worker进程,具体包括以下主要功能:
    1)接收来自外界的信号。
    2) 处理配置文件读取
    3) 创建,绑定和关闭套接字
    4)启动、终止和维护配置的工作(worker) 进程数
    5)当woker进程退出后(异常情况下),会自动重新启动新woker进程
    woker进程的主要任务是完成具体的任务逻辑,其主要的关注点是客户端后后端真实服务器(此时woker进程作为中间代理)之间的数据可读/可写等IO交互事件
    1)接收客户端请求
    2)将请求一次送入各个功能模块进行过滤处理
    3) 与后端服务器通信,接收后端服务器处理结果
    4)数据缓存
    5)响应客户端请求
    5.1 IO复用/EventLoop
    5.1.1 什么是IO复用?
    IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程,目前支持的IO复用的系统调用有select,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监听多个描述符,一旦某个描述符就绪,能够通知程序进行相应的读写

    5.1.2 select 介绍
    监视并等待多个文件描述符的属性变化(可读、可写或错误异常)。select函数监视的文件描述符有3类。分别是writefds,readfds和execpfds。调用后select 会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时函数才返回。当select()函数返回后,可以遍历fdset,来找到就绪的描述符,并且描述符最大不能超过1024
    (进程或者线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或者线程就被阻塞,函数不能立即返回)
    5.1.3 Poll 介绍
    poll的机制与select类型,与select本质上没有什么区别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量限制。poll和select同样存在一个缺点就是:包含大量文件描述符的数组被整体复制于用户态和内核空间,而不论这些文件描述符是否准备就绪,它的开销随着文件描述数量的增加而线型增大。
    缺点:
    select/poll问题很明显,他们需要循环检测是否有事件。如果服务器有上百万个连接,在某一段事件只有一个连接想服务器发送里数据,select/poll需要循环100万次。白白浪费了CPU资源。
    epoll 使用一个文件描述符管理多个描述符,将用户关系的文件描述符的时间存放到内核的一个事件表中。
    简单来说就是当连接有IO流事件产生的时候,epoll就会去告诉进程哪个连接有IO流事件产生,然后程序就去处理这个进程。
    IO复用异步非阻塞程序使用经典的Reactor模型

    进程相关
    fork函数
    fork函数将创建调用的进程的副本,并非根据完全不同的程序创建进程,而是复制正在运行的,调用fork函数的进程
    处理僵尸进程
    如果父进程没有正确的处理子进程的返回信息,子进程将停留在僵尸状态。

    总结

    nginx 的进程模型是多进程(master-woker)IO复用

    相关文章

      网友评论

          本文标题:Nginx原理读书笔记

          本文链接:https://www.haomeiwen.com/subject/ijbgzhtx.html