开发者学堂课程【Nginx 企业级 Web 服务实战:Nginx 基础介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/649/detail/10752
Nginx 基础介绍(二)
1.2: Nginx 组织结构:
web 请求处理机制:
①多进程方式:
服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,各子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
②多线程方式:
与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了 web 服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,另外一旦主进程挂掉则所有子线程都不能工作了,llS 服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
1.2.1:组织模型:
Nginx 是多进程组织模型,而且是一个由 Master 主进程和 Worker 工作进程组成。
(1)主进程(master process)的功能:
读取 Nginx 配置文件并验证其有效性和正确性建立、绑定和关闭 socket 连接:一个用户连接到 nginx 会有一个公网地址和端口
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
改变配置文件,使之生效,一般不重启服务,直接是使用命令 nginx -s reload
开启日志文件,获取文件描述符:
访问日志 access.log :每天的访问量、向后端服务的转发时间、日志监控
错误日志 error.log
不中断服务,实现平滑升级,升级失败进行回滚处理编译和处理perl脚本 : 升级之前,输入指令 nginx -t 可以测试配置是否存在问题
(2)工作进程(woker process)的功能:
接受处理客户的请求
将请求依次送入各个功能模块进行处理
IO调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据:一般公共存储中使用,在 nginx 中开辟一个小型空间,当用户第一次访问时,从 NAS 中下载数据到公共存储中,第二次访问相同资源时,直接从空间中返回,而不需要从 NAS 在返回,节省时间。
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
下图为 Nginx 逻辑图:
一个 Master 进程派生出多个 Woker 工作进程,工作进程中会加载多个核心模块。用户发起 http 请求,进程根据 I/O 类型,转发到相应模块进行处理。
Master 和 woker 之间,升级不中断服务。Backend(后端服务):包括 Web Server、Application server、Memcached。
Woker 进程调用 I/O 服务,类型有 Advanced I/O,sendfile,AIO,mmap etc.
2.2.2:进程间通信:
工作进程是由主进程生成的,主进程使用 fork() 函数,在 Nginx 服务器启动过程中主进程根据配置文件决定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出的指令、工作进程 ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
工作进程之间的通信原理基本上和主进程与工作进程之间的通信是一样的,只要工作进程之间能够取得彼此的信息,建立管道即可通信,但是由于工作进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息就只能通过主进程来设置了。
为了实现工作进程之间的交互,主进程在生成工作进程只之后,在工作进程表中进行遍历,将该新进程的 ID 以及针对该进程建立的管道句柄传递给工作进程中的其他进程,为工作进程之间的通信做准备,当工作进程1向工作进程2发送指令的时候,首先在主进程给它的其他工作进程工作信息中找到2的进程 IO,然后将正确的指令写入指向进程2的管道,工作进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了工作进程之间的通信。
下图为 Nginx 主进程与工作进程的通信过程:
2.3:Nginx 模块介绍:
核心模块∶是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能
标准 HTTP 模块︰提供 HTTP 协议解析相关的功能,比如:端口配置、网页编码设置、HTTP 响应头设置等等
可选 HTTP 模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输、解析 GeolP 请求、网络传输压缩、安全协议 SSL 支持等
邮件服务模块∶主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和SMTP 协议的支持
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、Lua 支持等
nginx 高度模块化,但其模块早期不支持 DSO 机制;1.9.11版本支持动态装载和卸载
模块分类:
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP core modules 默认功能
HTTP 0ptional modules 需编译时指定
Mail 模块 ngx_mail_*
stream 模块 ngx_stream_*
第三方模块