Nginx系列:nginx原理
文章目录
- Nginx系列:nginx原理
- 1. nginx的进程模型
- 2. 请求的处理过程
- 3. nginx的时间处理模型
- 4.模块化体系结构
- 5.nginx的最大连接数
1. nginx的进程模型
- 在nginx的服务刚启动的时候,只有一个nginx/master的主进程,随着访问或者请求到达nginx的服务器的时候,nginx/master进程会派生出很多的子进程nginx/worker来处理请求,这也是nginx处理高并发请求/服务的方式。
- 多进程:一个 Master 进程、多个 Worker 进程
- Master 进程:管理 Worker 进程
- 对外接口:接收
外部的操作
(信号) - 对内转发:根据
外部的操作
的不同,通过信号
管理 Worker - 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- worker进程:所有worker进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理;
- Worker 进程数量:在 nginx.conf 中配置,一般设置为
核心数
,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
2. 请求的处理过程
- HTTP建立连接建立和请求处理过程
- Nginx 启动时,Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master 进程,fork 出多个 Worker 进程
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
- Nginx 高性能、高并发:
- Nginx 采用:
多进程
+异步非阻塞
方式(IO 多路复用
epoll) - 请求的完整过程:
- 建立连接
- 读取请求:解析请求
- 处理请求
- 响应请求
- 请求的完整过程,对应到底层,就是:读写 socket 事件
3. nginx的时间处理模型
- request:Nginx 中 http 请求。
- 基本的 HTTP Web Server 工作模式:
- 接收请求:逐行读取
请求行
和请求头
,判断段有请求体后,读取请求体
- 处理请求
- 返回响应:根据处理结果,生成相应的 HTTP 请求(
响应行
、响应头
、响应体
- Nginx 也是这个套路,整体流程一致。
4.模块化体系结构
nginx的模块根据其功能基本上可以分为以下几种类型:
- event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等。nginx具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。
- phase handler: 此类型的模块也被直接称为handler模块。主要负责处理客户端请求并产生待响应内容,比如ngx_http_static_module模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。
- output filter: 也称为filter模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有html页面增加预定义的footbar一类的工作,或者对输出的图片的URL进行替换之类的工作。
- upstream: upstream模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream模块是一种特殊的handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。
- load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。
5.nginx的最大连接数
基础背景:
- Nginx 是多进程模型,Worker 进程用于处理请求;
- 单个进程的连接数(文件描述符 fd),有上限(
nofile
):ulimit -n
- Nginx 上配置单个 worker 进程的最大连接数:
worker_connections
上限为nofile
- Nginx 上配置 worker 进程的数量:
worker_processes
因此,Nginx 的最大连接数:
- Nginx 的最大连接数:
Worker 进程数量
x单个 Worker 进程的最大连接数
- 上面是 Nginx 作为通用服务器时,最大的连接数
- Nginx 作为
反向代理
服务器时,能够服务的最大连接数:(Worker 进程数量
x单个 Worker 进程的最大连接数
)/ 2。
ginx 作为反向代理
服务器时,能够服务的最大连接数:(Worker 进程数量
x单个 Worker 进程的最大连接数
)/ 2。 - Nginx 反向代理时,会建立
Client 的连接
和后端 Web Server 的连接
,占用 2 个连接