Linux-NGINX架构

Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器

  • Nginx 功能介绍
    • 静态的web资源服务器html,图片,js,css,txt等静态资源
    • http/https协议的反向代理
    • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
    • tcp/udp协议的请求转发(反向代理)
    • imap4/pop3协议的反向代理
  • 基础特性
    • 模块化设计,较好的扩展性
    • 高可靠性
    • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
    • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
    • event-driven,aio,mmap,sendfile
  • Web 服务相关的功能
    • 虚拟主机(server)
    • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
    • 访问日志(支持基于日志缓冲提高其性能)
    • url rewirte
    • 路径别名
    • 基于IP及用户的访问控制
    • 支持速率限制及并发数限制
    • 重新配置和在线升级而无须中断客户的工作进程

 

 Nginx 进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求。
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客 户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

 

 

主进程(master process)的功能:

对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:  监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程

读取Nginx 配置文件并验证其有效性和正确性 建立、绑定和关闭socket连接 按照配置生成、管理和结束工作进程 接受外界指令,比如重启、升级及退出服务器等指令 不中断服务,实现平滑升级,重启服务并应用新的配置 开启日志文件,获取文件描述符 不中断服务,实现平滑升级,升级失败进行回滚处理 编译和处理perl脚本

Maser工作过程细节

master 建立 listen 的 socket (listenfd)

master,fork 出 worker 进程(fork:进程镜像)
新请求到来时,所有 worker 进程的 listenfd 都变为可读
worker 进程,竞争 accept_mutex, 获胜的注册 listenfd 的读事件
worker 进程,在读事件中,accept 当前连接,并处理请求

 

工作进程(worker process)的功能:

所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量: 一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,增加上下文切换的损耗

接受处理客户的请求 将请求依次送入各个功能模块进行处理 I
/O调用,获取响应数据 与后端服务器通信,接收后端服务器的处理结果 缓存数据,访问缓存索引,查询和调用缓存数据 发送请求结果,响应客户的请求 接收主程序指令,比如重启、升级和退出等

 worker 工作过程细节

新请求到来时,所有 worker 进程的 listenfd 都变为可读

worker进程,竞争 accept_mutex, 获证的注册 listenfd 的读事件

worker进程,在读事件中, accept 当前连接

worker进程,读取请求,解析请求,处理请求,进行响应

nginx 进程间通信

工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决定启动工作进程的数量

然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。

主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。

 

 

worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一
个进程的状态信息,就只能通过主进程来实现。
为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做 准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指 令并进行相关操作,这样就完成了worker进程之间的通信。
另worker进程可以通过共享内存来通讯的,比如upstream中的zone,或者limit_req、limit_conn中的zone等。操作系统提供了共享内存机制
  • nginx 启动时,master进程,加载配置文件
    • master 进程,初始化监听的socket
    • mater 进程,fork 出多个 worker 进程
    • worker 进程,竞争新的连接,获胜方通过三次握手,建立socket 连接,并处理请求
posted @ 2022-05-30 20:09  goodbay说拜拜  阅读(52)  评论(0编辑  收藏  举报