网站首页 > 技术教程 正文
今天这篇主要是聊一些关于nginx中一些进程的管理,信号的传递,还有就是如何进行事件的处理的一些东西。
nginx进程
nginx主要的进程为master、work、cache。master是用来管理work进程的,所以master是不会有第三方模块进入代码的,它主要是管理work进程的状态,还有就是监测work进程是否需要文件重新载入,需不需要热部署;而work是用来处理正常的工作;缓存是在多个work之间进行共享的,cache manager(缓存管理)和cache loader(缓存的载入)是为了反向代理时后端请求做缓存使用的,实际上每个请求使用的缓存还是由work进程来进行,这些进程之间的通信都是由共享内存处理的。
那么为什么采用多进程结构而不是多线程结构呢?这是因为Nginx最核心的功能是要保证它的高可靠性、高可用性,如果Nginx采用多线程结构的时候,因为线程之间共享的是同一个地址空间的,如果某一个第三方模块引发的地址空间越界时会导致整个Nginx挂掉,而多进程不会出现这个情况。
刚才说到nginx会有master节点和work节点,这是因为Nginx采用了事件驱动的模型之后,希望每个work进程独占一颗CPU,往往不只需要将Nginx的work进程配置的和CPU核数相同,还要和CPU的某个核绑定在一起,这样是为了更好的使用CPU上面的缓存,减少CPU缓存的失效数。
nginx信号管理
在master进程中,主要是有两个信号的操作,一个是监控work进程,另一个是管理work进程。
首先是监控work进程,主要的动作是查看work进程有没有发送CHLD信号,Linux操作系统中规定当子进程终止的时候会向父进程发送CHLD信号。当work意外终止时,master进程会通过CHLD信号快速知道这个事件。然后重新把work进程拉起。
管理worker进程,主要有以下信号:
TERM, INT 立刻停止Nginx进程
QUIT 优雅的退出进程
HUP 重载配置文件
USR1 重新打开日志文件,作为日志切割
USR2 只能通过kill直接向master信号,作为热部署使用
WINCH 只能通过kill直接向master信号,作为热部署使用
对于work进程的信号主要是以下几种:
TERM, INT 立刻停止Nginx进程
QUIT 优雅的退出进程
USR1 重新打开日志文件,作为日志切割
WINCH 只能通过kill直接向master信号,作为热部署使用
当然通常情况下不会对work进程直接发送信号,都是通过master进程来控制work进程,当我们向master发送指令的时候master进程会通过信号向work进程发送信号。
Nginx命令行
reload:HUP
reopen:USR1
stop:TERM
quit:QUIT
nginx的pid存放在logs目录下的nginx.pid 目录中,这个文件存放master进程的pid当我们向nginx发送命令的时候,nginx会去找自己的pid然后找到master进程的pid最终实现我们的命令。
nginx的请求处理流程
首先是三种状态机,第一种是处理TCP/UDP四层协议的传输层状态机;第二种是处理应用层协议HTTP请求的状态机;第三种是处理邮件的状态机。nginx主要是通过这三种状态机来处理事件的。那么有个问题是nginx为什么使用状态机来处理事件呢?因为Nginx的时间处理是异步IO模型来处理事件,通常我们使用异步IO模型处理事件是需要状态机将请求正确处理和识别的。异步IO是一种非阻塞事件处理。
当我们需要访问静态资源的时候状态机会识别并指向静态资源,如果我们访问反向代理的时候也要去磁盘中读取,如果内存不能缓存所有的静态资源的时候回退化成阻塞的处理,所以需要一个线程池,将所有的请求记录到日志中去。更多的时候我们的Nginx是作为负载均衡和反向代理的,我们的Nginx可以通过HTTP等协议将数据传到后台。
猜你喜欢
- 2024-10-15 每个程序员应该彻底掌握的多线程编程(Linux C)
- 2024-10-15 线程池的使用场景和代码实现(线程池应用实例)
- 2024-10-15 Netty核心精讲之Reactor线程模型(netty 线程池模型讲解)
- 2024-10-15 浅谈Nginx服务器的内部核心架构设计
- 2024-10-15 java终极指南:你必须了解的提高Nginx服务器硬度的10个技巧
- 2024-10-15 三分钟了解PHP的进程和线程(三分钟了解php的进程和线程的区别)
- 2024-10-15 java面试之Nginx篇(javaweb nginx)
- 2024-10-15 linux服务器网络编程之线程模型(linux服务端多线程编程)
- 2024-10-06 一分钟快速部署Django应用(django用啥部署比较方便)
- 2024-10-06 redis7.0源码阅读:Redis中的IO多线程(线程池)
你 发表评论:
欢迎- 最近发表
-
- linux CentOS检查见后门程序的shell
- 网络安全工程师演示:黑客是如何使用Nmap网络扫描工具的?
- Linux中ftp服务修改默认21端口等(linux修改ftp配置文件)
- Linux系统下使用Iptables配置端口转发,运维实战收藏!
- 谈谈TCP和UDP源端口的确定(tcp和udp的端口号相同吗)
- Linux 系统 通过端口号找到对应的服务及相应安装位置
- 快速查找NAS未占用端口!Docker端口秒级排查+可视化占坑双杀技
- 【知识杂谈#2】如何查看Linux的(本地与公网)IP地址与SSH端口号
- 如何在Linux中查询 DNS 记录,这三个命令可谓是最常用、最经典的
- 【Linux系统编程】特殊进程之守护进程
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)