nginx模型

本文介绍了Nginx的工作模型,包括master进程和worker进程的角色与职责。master进程负责管理worker进程并处理外部信号,而worker进程则处理客户端请求。文章还详细解释了请求处理流程及如何通过信号控制Nginx。

nginx

nginx工作模型,nginx服务起来后,ps下看到有master+N个worker进行工作,

ps aux|grep nginx
ork      1846  0.0  0.3 80100 27632 ?       S    Aug03   3:02 nginx: worker process
work      4311  0.0  0.1 46728 12032 ?       Ss   Jul19   0:00 nginx: master process /home/work/nginx/sbin/nginx -p /home/work/nginx -c /home/work/nginx/conf/nginx.conf
work      4312  0.0  0.3 66360 32356 ?       S    Jul19  16:19 nginx: worker process
work      4313  0.0  0.3 66360 32368 ?       S    Jul19  18:34 nginx: worker process
work      4314  0.0  0.3 66360 32372 ?       S    Jul19  18:09 nginx: worker process
work      4315  0.0  0.3 66360 32388 ?       S    Jul19  17:29 nginx: worker process
work      4316  0.0  0.3 66360 32388 ?       S    Jul19  17:40 nginx: worker process
work      4317  0.0  0.3 66360 32368 ?       S    Jul19  17:23 nginx: worker process

#

在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

Nginx在启动后,会有一个master进程和多个worker进程。

master进程

主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。

worker进程:

而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

nginx的进程模型,可以由下图来表示:

### Nginx 网络模型、架构与工作原理 #### 一、Nginx 的网络模型概述 Nginx 使用的是基于异步和非阻塞的事件驱动模型来处理大量的并发请求[^4]。该模型的核心思想是通过高效的事件循环机制,避免传统线程池或进程池带来的上下文切换开销。 #### 二、Nginx 的架构组成 Nginx 的整体架构由多个模块协同完成各种功能需求。以下是主要组成部分及其作用: 1. **核心模块** - 核心模块主要包括 HTTP 模块、事件模块和解析器模块等[^3]。 - **HTTP 模块**: 负责处理 HTTP 协议相关的事务,例如解析 HTTP 请求头、分析 URI 并生成相应的响应数据。 - **事件模块**: 提供底层支持用于监听文件描述符上的读写事件,具体实现依赖于操作系统的特性(如 Linux 上的 `epoll` 或 FreeBSD 上的 `kqueue`)。 - **解析器模块**: 主要职责是对配置文件进行语法验证并加载到内存中以便后续使用。 2. **第三方模块** 开发者可以根据实际应用场景开发自定义插件并通过动态链接库的形式集成进来[^2]。这些额外的功能增强了基础框架的能力范围,比如增加认证鉴权逻辑或者日志记录格式调整等功能都可以借助这种方式轻松达成目标。 #### 三、Nginx 的工作流程详解 当客户端发起一次访问请求到达部署有 Nginx 的服务器时,整个过程大致如下所示: 1. 客户端发送 HTTP/HTTPS 请求至指定 IP 地址及端口号; 2. Master Process 接收到来自外部的新连接后会将其分派给某个 Worker Processes 来具体执行业务逻辑运算;此阶段利用了操作系统提供的高级 I/O 多路复用技术(EPOLL/KQUEUE),从而极大提高了资源利用率同时降低了延迟时间成本; 3. Worker Processes 获取对应 socket 文件句柄之后进入主事件循环等待触发条件满足再依次调用各个子组件完成最终输出结果组装并向远端回应成功与否状态码及相关实体内容;期间可能涉及到静态页面直接返回亦或是转发至上层应用服务实例继续计算得出结论后再反馈回去形成闭环交互链路结构图谱展示清晰明了便于理解掌握要点所在之处。 ```python # 示例代码片段展示了如何设置 worker_processes 参数以优化性能 worker_processes auto; # 自动检测 CPU 数量并创建相应数量的工作进程 events { use epoll; # 对于 Linux 系统推荐使用 epoll worker_connections 1024; # 设置单个工作进程的最大连接数 } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } } ``` #### 四、与其他软件比较优势说明 相比于其他同类产品 Haproxy 和 LVS ,Nginx 不仅具备出色的稳定性和可靠性,在面对大规模流量冲击情况下依然能够保持较低延时水平的同时维持较高的吞吐率指标表现优异[^5] 。另外值得一提的地方还有就是它内置了完善的反向代理以及负载均衡策略可供选择适配不同场景下的特殊定制化需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值