主要分析一下worker进程的情况。首先找到worker进程的入口-ngx_worker_process_cycle。这个函数不仅是worker进程的入口函数,而且是worker进程 循环工作的主要函数。

首先将全局变量ngx_process设置为worker进程的标志,然后调用ngx_worker_process_init,对worker进程作初始化操作。先看看worker进程的初始化过程。

    if (ngx_set_environment(cycle, NULL) == NULL) {/* fatal */exit(2);}

上面是设置相应的环境变量。接着就是设置一些资源的限制,id等参数。

    for (i = 0; ngx_modules[i]; i++) {if (ngx_modules[i]->init_process) {if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {/* fatal */exit(2);}}}

上面代码是循环调用每个模块的init_process,完成每个模块的进程初始化操作。调用init_process的模块比较少,只有ngx_event_process_init、ngx_google_perftools_worker、ngx_http_perl_init_worker、ngx_http_userid_init_worker。

    for (n = 0; n < ngx_last_process; n++) {if (ngx_processes[n].pid == -1) {continue;}if (n == ngx_process_slot) {continue;}if (ngx_processes[n].channel[1] == -1) {continue;}if (close(ngx_processes[n].channel[1]) == -1) {ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,"close() channel failed");}}

上面代码主要是关闭其它进程的channel资源。

    if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,"close() channel failed");}

因为worker进程主要是读取master进程发过来的消息,所以worker进程关闭本进程的写通道,只保留读通道。

    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,ngx_channel_handler)== NGX_ERROR){/* fatal */exit(2);}

将本worker进程的读通道加入到nginx关心的集合中,即读通道上有数据到来后,就作相应的读操作。

此处初始化结束。

    for ( ;; ) {if (ngx_exiting) {c = cycle->connections;for (i = 0; i < cycle->connection_n; i++) {/* THREAD: lock */if (c[i].fd != -1 && c[i].idle) {c[i].close = 1;c[i].read->handler(c[i].read);}}if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel){ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");ngx_worker_process_exit(cycle);}}ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");ngx_process_events_and_timers(cycle);if (ngx_terminate) {ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");ngx_worker_process_exit(cycle);}if (ngx_quit) {ngx_quit = 0;ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,"gracefully shutting down");ngx_setproctitle("worker process is shutting down");if (!ngx_exiting) {ngx_close_listening_sockets(cycle);ngx_exiting = 1;}}if (ngx_reopen) {ngx_reopen = 0;ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");ngx_reopen_files(cycle, -1);}}

ngx_exiting是在worker进程收到SIGQUIT信号后,在worker进程退出前,处理完每个connection上发生的事件,处理完成后,进程退出。

ngx_process_events_and_timers是进程处理事件的核心。

ngx_ternimate是worker进程收到SIGINT信号后,进程退出。

ngx_quit是进程收到SIGQUIT信号,如果此时worker进程不是处于exiting状态,就将ngx_exiting设置为1,让其进入exiting状态,同时关闭监听套接口。

ngx_reopen是进程收到SIGUSR1信号。

worker进程的处理流程差不多就是这样了。

nginx进程管理之worker进程相关推荐

  1. nginx进程管理之master进程

    nginx分为single和 master两种进程模型.master模型为一个master模型和n个worker进程的工作方式 .本文分析nginx的 master进程做了哪些事情,它是如何管理好各个 ...

  2. nginx的master和worker进程间的通信

    本文 主要分析master进程和worker进程之间是如何使用channel来完成通信的.这部分实现的代码主要分布在src/os/unix/ngx_channel.c文件中.master进程将数据传给 ...

  3. linux进程管理机制,linux进程管理,linux进程管理机制

    linux进程管理,linux进程管理机制 一.基本介绍 1.在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号 2.每一个进程,都会对应一个父进程,而这个父进程 ...

  4. Linux入门之进程管理(4)之进程与文件

    Linux入门之进程管理(4)之进程与文件 前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的,但是在某些情况下,想要查看某个文件或者某个设备被哪些进程所使 ...

  5. 操作系统之——进程管理:同步进程和进程互斥

    操作系统进程管理-同步和互斥 在看了操作系统关于进程管理中的同步互斥机制章节之后,甚是困惑,今天通过视频.网上博客资料学习之后,整理一下相关知识点. 进程管理 一.进程互斥 由于进程具有独立性和异步性 ...

  6. Nginx启动只有master进程而没有worker进程

    大致按照下面文章的提示进行排查: https://blog.csdn.net/sinat_37729104/article/details/102662475 https://blog.csdn.ne ...

  7. 【知识强化】第二章 进程管理 2.1 进程与线程

    处理机管理相关的内容.认识一个很重要的概念叫做进程. 系统当中正在运行的程序怎么怎么地,怎么怎么地,偶尔也会提到进程这个术语."进程"和"程序"这两个概念是比较 ...

  8. linux kernel 进程管理,Linux内核 | 进程管理

    1. 进程和线程 1.1 定义 进程是处于运行状态的程序和相关资源的总称,是资源分配的最小单位. 线程是进程的内部的一个执行序列,是CPU调度的最小单位.有一段可执行程序代码. 有一段进程专用的系统堆 ...

  9. Linux进程管理(第二版) --进程管理命令

    进程管理命令 一.查看用户信息w 1. w显示信息的含义 TTY:说明用户登录的方式,ttyN:表示以本地终端登录;pts/N表示以远程终端登录 JCPU:以终端代号来区分,该终端所有相关的进程执行时 ...

最新文章

  1. 【Python第六篇】Python面向对象(进阶篇)及相关(异常处理、反射)
  2. 「mysql优化专题」单表查询优化的一些小总结,非索引设计(3)
  3. 开源库OpenNMT-py使用记录
  4. Web前端开发笔记——第四章 JavaScript程序设计 第四节 条件语句和循环语句
  5. 拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)
  6. M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)
  7. 查看及修改MYSQL最大连接数
  8. linux 查看添加的镜像源,linux镜像源的查看、配置以及删除
  9. [Photography] 还是DPP好!
  10. 网站速度优化的三套解决方案
  11. 我的口号:我是金鳞,我敢评!
  12. 在Jetty中快速搭建SSL
  13. SQL22 统计各个部门的工资记录数
  14. keil软件仿真逻辑分析仪出现了Unknown Signal
  15. oracle12免安装版配置,配置免安装版Oracle客户端
  16. 大数据采集技术与预处理
  17. 中国计算机学会推荐国际期刊和会议2011
  18. matlab模拟风场竖桥向时程,大跨度桥梁三维脉动风场的计算机模拟
  19. word如何首页和目录不编辑页码
  20. 中国劳动力动态调查数据(CLDS)2011-2018年

热门文章

  1. laravel 验证器怎么验证json对象_Postman使用tv4进行JSON Schema结构验证和断言
  2. python3.8.2安装教程-在服务器上安装python3.8.2环境
  3. python制作excel表格-excel表格中怎么制作一份燃尽图表
  4. python股票自动交易从零开始-python程序化交易编程-python制作自动交易程序!
  5. python有趣代码-你都知道哪些有趣的Python代码?
  6. python语言是谁发明的咋读-Guido发明的python语言是哪一年正式发布的?
  7. python3.7 6如何安装-redhat7.6 安装Python 3
  8. c语言 python-C语言、Java语言和python语言的区别在哪里
  9. python100个必背知识-学Python必背的初级单词,你都背了吗?
  10. python菜鸟工具-Python3 教程