Nginx: 进程结构和信号量管理

news2024/9/22 7:29:26

进程结构

  • 需要首先关注多进程和多线程的一个区别
  • Nginx采用的是一种多进程,这样一种进程结构, 为何不采用多线程这样一种进程结构
  • Nginx 设计之初就是为了高可能性和高可靠性而设计的
  • Nginx 通常是运行在边缘节点上,通常是用来接受用户的第一个请求的时候,所需要的一个服务器
  • 对于服务器本身就有了更高的要求,要求服务器本身的应用程序有足够的健壮性
  • 如果要采用一种多线程的一种线程结构的时候,会遇到一个最大的问题是
    • 如果有一个线程,因为代码写的不够多健壮,导致了某一段地址,空间越界出现了错误
    • 可能会导致我们整个线程的不可用,多线程是采用共享同一个地址空间来实现的
  • 所以说Nginx采用的是一种多进程的这样一种进程结构
  • 上端有一个 Master Process,而下面有
    • CM, CL 和 4个 worker process
  • 对于Master Process来说,它并不真正的处理用户请求,而真正处理用户请求是worker process
  • worker process 在实际的生态环境也不一定是4个
  • Nginx 是模块化设计的, 有了这样一个master,还有很多的第三方模块
  • Nginx 推行的一个原则就是,开发自己的第三方模块的时候,应该尽可能的减少修改 Master Process这样一个主程序模块
  • 如果 Master Process 要挂的话,肯定整个服务就不可用了
  • Nginx 在设计之初的时候,也是尽量的建议自己的开源生态,开发者开发自己的第三方模块的时候,尽可能的不要去修改 Master Process这样一个模块,而是只需要在你的第三方模块中进行修改
  • 即使是你的第三方模块出了问题,那也不会导致我们整个Nginx的一个宕机
  • 对Nginx本身来说,它是允许去修改它的 Master Process 这样一个主模块的, 但是通常来说没有人会去这样做
  • Master Process: 本身并不真正用来处理用户请求,而只是用来管理下面的缓存模块啊,或子进程
  • Worker Process: 本身是需要真正去处理用户请求的, Master Process 只是是来监控 Worker Process 子进程,比如重启子进程来维持正常运行,一个子进程宕了, 在 linux 中子进程会自动发送信号给主进程,自动启动一个新的来维持原有的数量
  • 当某一个配置文件修改了,更改了Nginx的一个特性,比如增加配置,静态资源或调整URL, 主进程在监测到了之后,它也会通知子进程去拿新的配置文件生效,对于这样一种场景来说,就是热部署
  • 热部署就是更改了我们的程序代码,需要影响原有的这个请求处理的过程而平滑升级
  • Master Process 下面还管理的两个子进程,一个是 CM,还有一个是 CL,是和缓存有关的进程,在反向代理场景中,它会把动态请求代理给后端的一个应用程序服务器,在代理应用程序到达应用程序服务器之后,应用程序服务器在经过计算之后,把动态内容返回给Nginx的过程中,也可以直接用这样一个 cache loader 去缓存起来, 其实真正的缓存功能并不是CM 和 CL提供的
  • 真正用来响应用户请求的是 worker process 子进程, 真正需要去缓存哪些内容,怎么样去接收应用程序发过来的,这些内容都是由我们的worker process来进行的,CL 是用来加载缓存,CM是用来管理缓存的,这些子进程之间的通信都是使用共享内存的形式来进行通信的
  • Nginx 设计的初衷本身就是为高可能性和高可靠性而设计的

信号量管理


1 )Linux 的信号量管理

  • 在Linux 操作系统中,对于进程管理是通过信号量来进行管理的, 比如说我们通常使用的q命令

  • 通过 kill 命令,可以给某个进程PID发送很多的信号量,通常,直接使用 kill pid 的时候

  • 相当于给linux发送一个 kill - 15 这样一个命令(代号)

  • $ kill -l 可查看所有

  • 以上可以看到,现在大概是有 64 种信号量

  • 可见, kill -9 可以发送一个 SIGKILL 的信号,它不管当前进程处于什么状态,无条件终止

  • 常用信号量, 参数含义

    代号命令
    SIGCHLDkill -17 $PID
    SIGQUITkill- 3 $PID
    SIGTERMkill -15 $PID
    SIGKILLkill - 9 $PID
    SIGHUPkill -1 $PID
    SIGUSR1kill -10 $PID
    SIGUSR2kill -12 $PID
    SIGWINCHkill -28 $PID
    • SIGCHLD
      • linux的一个父子进程之间进行通信的一个信号量
      • 在 linux操系系统可以对子父进程 forker 出来很多的子进程
      • 如果,其中某一个子进程 宕掉了,或者是由于其他因终止之后
      • 它会自动的发送一个 SIGCHLD 这样一个信号量给父进程
      • 让父进程可以收到子进程已经宕掉了的一个信号量
      • 从而让父进程采取一些其他的措施,比如说重新启动一个新的子进程
    • SIGQUIT
      • SIGQUIT 在使用的时候就相当于是它的信号量的一个代码 kill -3
      • 其实在发送这样一个信号量的时候,就相当于在键盘上使用了 ctrl + |
      • 就比如说一个脚本正在输出很多的数据, 使用 ctrl + | 的话,它是会对进程发出一个 SIGQUIT 信号
    • SIGTERM
      • 日常用的最多, -15 可以省略,kill + pid,相当于发送进程终止的信号
      • 但是允许进程处理完现有的数据,最后优雅的关闭进程,由进程决定何时关闭
    • SIGKILL
      • 日常用的最多,-9 表示立即终止
    • SIGHUP
      • 让进程重新读取配置文件,它会去迫使这样一个进程,重新读取配置文件
      • 比如说,更改的配置文件,需要生效新的配置的时候,就可以给这个管理进程发送
      • 这样一个信号,迫使我们当前的进程去重读配置文件,生效配置
    • SIGUSR1
    • SIGUSR2
      • 以上两个都是 linux 提供给用户自定义的信号量
      • 不满足需求,可以通过此自定义
    • SIGWINCH
      • 和上面两个一样,都用于平滑升级

2 )使用信号量管理 Nginx

2.1 使用信号量管理 master 和 worker

  • 看下 Nginx 有哪些子进程是可以使用信号量对它进行管理的,Nginx 进程结构就是由一个 master 主进程和若干 worker 子进程来组成的

2.1.1 Master 进程

  • 很明显, master进程就是一个管理进程,管理进程, 可以给它发送信号量
  • 由它来对整个 Nginx 进行这个管理
  • Master 进程有如下任务
    • 监控 worker 进程
      • 在linux中worker 子进程宕掉之后,它会主动给Master进程发送一个CHILD这样一个信号
      • 通知Master进程去采取进一步措施
    • 管理 worker 进程,接收信号
      • TERM, INT: 终止进程
      • QUIT:会等待当前用户请求处理完之后才平滑关闭终止
      • HUP:重读配置文件,改变Nginx行为,kill 之前的进程,重启后读取
      • USER1
      • USER2
      • WINCH

2.1.2 worker 进程

  • worker 进程,并不推荐直接给它发送信号量,对它进行管理, 因为它们是由 master进程来进行管理和维护的,比如说某一个work进程宕掉了,master进程会自动监控到并且重新启动一个新的worker进程,从而来维持固定数量的一个worker进程这样一个进程结构
  • 通常会推荐直接向 master 进程发送一个信号量,由master进程对worker进程进行管理
  • Worker 进程
    • 接收信号
      • TERM, INT
      • QUIT
      • USR1
      • WINCH

2.1.3 命令行

  • 还可以通过命令行:直接通过Nginx的二进制程序,加一些参数来对其进行行理
  • 命令行
    • reload: HUP 也是重读配置文件
    • reopen: USR1 重新打开日志文件
    • stop: TERM 停止 Nginx
    • quit: QUIT 停止 Nginx
  • 背后也是给 Master 进程发送信号,提供命令行管理形式而已

2.2 实际管理

  • $ ps -ef | grep nginx 查看 nginx 进程细节
    root           26695           1            0          02:09 ?            00:00:00         nginx:master  process  /opt/nginx/sbin/nginx
    nginx          26703           26695        0          02:10 ?            00:00:00         nginx:worker  process
    nginx          26704           26695        0          02:10 ?            00:00:00         nginx:worker  process
    nginx          26705           26695        0          02:10 ?            00:00:00         nginx:worker  process
    nginx          26710           26695        0          02:10 ?            00:00:00         nginx:worker  process
    root           26716           26549        0          02:18 pts/0        00:00:00         grep --color=auto nginx
    
  • 接下来, 就来实际的看一下怎么样对这些进行管理的
  • 2.2.1 ) 现在已经启动了一个Nginx ,这里有一个master主进程
  • 这个master主进程的PID号是 26695,同时它也生成了4个worker子进程
  • work子进程,每一个都是有一个单独的PID, 但是父进程都是 26695
  • 但是他们的副进程大家看都是这个二六六九五,对吧?
  • Nginx 采用的是事件驱动模型事件处理机制,对于这样一个事件处理机制来说
  • 它就尽可能的要求Nginx从始至终的一个worker进程都要跟一个CPU绑定在一块
  • 从而尽可能的去减少CPU的这种切换,从而提高这个CPU缓存的一个命中效率
  • 通常的一个 Nginx 服务器都会跟 CPU进行绑定,CPU有多少颗,通常就会启动几个worker子进程
  • 现在看下 Nginx 的配置文件
    worker_processes     auto;  # 这样配置,Nginx 会自行检测CPU核心个数,自行启动对应个数
    
    • 我们可以把这个 auto 修改成 2个
  • 现在我们 kill 26695 当前的 nginx,再重新启动 $ /opt/nginx/sbin/nginx
  • 这时候 $ ps -ef | grep nginx 发现,只有2个子进程了, 所以,默认是 auto,这样省事省心
  • 同时,我们可以通过 lscpu 的命令,可查看对应的服务器cpu核心数量
  • 现在对 master 进程进行管理测试:$ kill -s SIGTERM 26733
    • 再次 $ ps -ef | grep nginx 发现 Nginx 进程已经消失了
  • 测试重读配置文件,$ kill -s SIGHUP 26747 这个 26747 是新启动的nginx的主进程
    • 当执行这个命令时,子进程的pid变化了,也就是其实他重启了子进程来进行重读的
  • 其他类似信号,可以同等测试
  • 2.2.2 ) 这里,也可以对 worker 子进程进程信号量管理,虽然不推荐,操作同上,将pid换成子进程即可
    • 注意,如果操作杀死子进程,那么主进程会立即重启一个新的
  • 2.2.3 ) 现在尝试对命令行进行管理
    • 可以通过 $ /opt/nginx/sbin/nginx -h 查看有哪些命令可以使用
      nginx version: nginx/1.16.1
      Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
      Options:
      	-?,-h			: this help
      	-v				: show version and exit
      	-V	       		: show version and configure options then exit
          -t				: test configuration and exit
      	-T  			: test configuration, dump it and exit
      	-q				: suppress non-error messages during configuration testing
      	-s signal		: send signal to a master process: stop, quit, reopen, reload
      	-p prefix		: set prefix path (default: /opt/nginx/)
      	-c filename 	: setconfigurationfile(default:/opt/nginx/conf/nginx.conf)
      	-g directives 	: set global directives out of configuration file
      
    • $ /opt/nginx/sbin/nginx -s stop 停止
    • $ /opt/nginx/sbin/nginx -s reload 重启,重读和HUP类似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)

目录 大会介绍 基本信息 合作单位 主讲嘉宾 会议组委 征文主题 ​编辑 参会方式 会议日程 中国-天津 | 2024年10月25-27日 | 会议官网:www.aiiip.net 大会介绍 第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)将…

如何通过PLM系统提升企业研发效率与市场竞争力?

在当今快速变化的商业环境中,企业的研发能力和市场响应速度成为了决定其竞争力的关键因素。PLM系统作为一种集成了产品设计、开发、制造、销售、服务及最终报废等全生命周期信息的集成化管理平台,正逐渐成为企业提升研发效率、加速产品创新、优化资源配置…

Java后端面试题(微服务相关)(day12)

目录 分布式与微服务区别?什么是CAP原则?Spring Cloud Alibaba 组件有哪些?Nacos配置中心动态刷新原理目前主流的负载方案有哪些?Nginx作为服务端负载均衡器,常见的负载均衡策略有哪些?Spring Ribbon相关Sp…

中秋佳节,好物相伴 —— 精选五款数码好物推荐

中秋佳节,不仅是家人团聚的时刻,也是享受科技与生活的完美结合的好时机。在这个充满温情的节日里,我们为您精心挑选了五款数码好物,其中包括备受好评的南卡Runner Pro5骨传导耳机,以及其他四款各具特色的数码产品&…

中国电子学会Python3级等级考试202403客观题解析2

11、单选题 关于语句 fopen(r"c:\计算.txt",w),下列描述不正确的是?( ) A f 是变量 B w以写方式打开文件 C 如果文件“计算.txt”不存在,不会报错 D 如果文件“计算.txt”内原来有内容,将不…

数据库透明加密的定义与原理

数据库透明加密(TDE)是一种先进的加密技术,主要用于保护存储在数据库中的敏感数据,防止未经授权的访问和数据泄露。以下是对数据库透明加密的详细解析: 一、定义与原理 定义:数据库透明加密是一种在数据库管理系统(DBMS)中集成加密…

软考高级:系统架构设计师——软件架构设计 Chapter 笔记

软考高级:系统架构设计师——软件架构设计 1 软件架构设计—基本概念架构所处的位置架构发展历程架构的“41”视图例题 架构描述语言(ADL)例题 2软件架构设计—架构风格数据流风格调用/返回 风格独立构件风格虚拟机风格仓库风格(以…

Codeforces Round 970 (Div. 3) (个人题解)(未补完)

前言: 昨天晚上的比赛,可惜E题太笨了没想到如何解决,不过好在看到F过的多直接跳过去写F了,能过个5个也还不错了,而且一个罚时也没吃。之后的题我还是会再能补的时候补完的噢! 正文: 链接&…

ELK(Elasticsearch、Logstash、Kibana) 分布式日志搭建详细过程

ELK是三款软件的简称,分别是Elasticsearch、 Logstash、Kibana组成 本文中描述了ELK日志平台的详细搭建过程,不对工具用途做描述。 一、准备 安装包 所需安装包及官网下载地址: elasticsearch-8.14.3-linux-x86_64.tar.gz (https://www…

2024 【Delphi 12】苹果ios开发环境配置(五星保姆级)

目录 一、创建证书 1. 创建证书签名请求:(在苹果电脑上操作): .certSigningRequest 文件 2. 创建证书:在苹果的 开发者网站 上操作 重复以上步骤并下载对应的证书文件如下: 3. 创建标识符(…

引爆关注!LLM大模型开源项目突破34.4千星,热度飙升!

其实这个Repo在外网知名度很高,但咱这似乎没看到咋推 随着近两年大型语言模型的发展,LLM在生活中发挥着愈发重要的作用,通过改变我们与技术互动的方式,为医疗、金融和教育等各领域带来变革性的变化,之前AI周刊中也说了…

开放式耳机怎么戴?开放式耳机比入耳式耳机舒适吗?

开放式耳机佩戴教程如下: 选择合适的耳挂或支架:开放式耳机通常有耳挂式或头梁式等设计。如果是耳挂式,确保耳挂的大小和形状适合您的耳朵,能够稳固地挂在耳朵上;如果是头梁式,调整头梁的长度,使…

交易处理商TAAL公司深度参与BSV区块链的ARC研发

​​发表时间:2024年8月7日 TAAL技术主管Michael Bckli表示,TAAL公司一直在对ARC进行测试,并准备在今年年底全面发布。因TAAL在区块链交易处理方面具备深厚的专业知识,BSV区块链委托TAAL进行ARC开源参考落地方案的开发。 ARC是一个…

jmeter的1个线程如何遍历提取到的1个变量的多个值?

某个请求的uri是动态变化的,且这个url这个从上一个接口中提取到,但是其值可能有多个,也可能有1个,1个用户执行时,需要将这几个值作为uri全部请求一遍。 如我需要把变量C53这个变量(共计取到了3个值&#x…

Language Models are Few-Shot Learners

Abstract 最近的研究表明,通过在大量文本语料上进行预训练,然后在特定任务上进行微调,可以在许多自然语言处理任务和基准测试中取得显著进展。尽管这种方法在架构上通常是任务无关的,但它仍然需要特定任务的微调数据集&#xff0…

机器人外呼有哪些优势?

机器人外呼,作为一种结合了计算机技术和人工智能技术的自动化工具,具有多重显著优势。以下是其主要优势的详细阐述: ### 1. 高效性 * **大幅提升工作效率**:机器人外呼可以全天候、不间断地进行工作,不受时间、地点和…

第二十一届华为杯数学建模经验分享之资料分享篇

今天给大家分享一些数学建模的资料,通过这些资料的学习相信你们一定在比赛中获得好的成绩。今天分享的资料包括美赛和国赛的优秀论文集、研赛的优秀论文集、推荐数学建模的相关书籍、智能算法的学习PPT、python机器学习的书籍和数学建模经验分享与总结,其…

PlugIR:开源还不用微调,首尔大学提出即插即用的多轮对话图文检索 | ACL 2024

即插即用的PlugIR通过LLM提问者和用户之间的对话逐步改进文本查询以进行图像检索,然后利用LLM将对话转换为检索模型更易理解的格式(一句话)。首先,通过重新构造对话形式上下文消除了在现有视觉对话数据上微调检索模型的必要性&…

想亲手制作一款属于自己的游戏吗,游戏零基础入门【文末送书】

学习目录 📢 前言 🎬 Unity简介🎥 Unity学习专栏介绍🥇 专栏亮点🙉 适用对象🎁 赠送学习书籍 💬 结语 📢 前言 随着科技的不断进步,游戏制作领域迎来了前所未有的发展机…

EE trade:辨别真假银5个实用的技巧

从古至今, 银器以其闪耀的光泽和高贵典雅的魅力, 深受人们喜爱。 然而, 由于银具有较高的市场价值, 也引来了一些不法商贩的仿造。 如何辨别真假银, 成为许多人关注的话题。 别担心, 今天我们就来揭秘5个简…