前言

简单介绍一下nginx的设计模型,对我们设计程序还是有一定帮助的。

正文

这里先列一下模型哈,后面有深入篇,介绍的比较清楚。

nginx 的处理模型:

nginx 进程模型:

可以看到下面列出了进程:

这里的worker 进程只有一个哈。

同样可以看到他们的关系,父进程是master process nginx。

然后我们看一下nginx -s reload 重新加载配置做了什么,前文提及到一个东西,那就是这个是让worker 优雅的退出。

执行完后再看一下:

上面那两个进程不见了,取而代之的是后面那两个进程。

有时候我们执行nginx -s reload 不生效,这是为什么呢,因为是优雅退出,老的还在处理,所以可以观察一下进程。

同样这个命令其实也是和kill -HUB pid一样的。

同样nginx -s quit,也是有对应的命令的,kill -SIGTERM pid 效果其实是一样的。

对worker pid 执行:kill -SIGTERM pid,那么workder 会优雅推出。但是父进程检测到和其期望的不相符合,那么会再创建一个。

对父进程执行kill -SIGTERM pid 其实和nginx -s quit 一样的。

那么还有那些信号量可以管理nginx的进程呢?

master 进程:

监控worker 进程: CHLD(当子进程结束的时候要向父进程发送CHLD信号)
管理worker 进程
接收信号:
term,int(立即停止)
quit(优雅停止)
hub(重载配置文件)
usr1(重新打开日志文件)
usr2(只能通过kill 发送, 热部署)
winch(只能通过kill发送,停止worker)

worker 进程:

term,int(立即停止)
quit(优雅停止)
usr1(重新打开日志文件)
winch(只能通过kill发送,停止worker)

nignx命令行:

reload :HUP
reopen:USR1
stop:TERM
quit:QUIT

reload 执行流程:

  1. 向master 进程发送hub 信号(reload 命令)

  2. master 进程校验配置语法是否正确

  3. master 进程重新打开新的监听端口

  4. master 进程用新配置启动新的worker 自进程

  5. master 进程向老wokrer 进程发送quit信号

  6. 老worker 进程关闭监听句柄,处理完当前连接后结束进程

可以看到只有到这个关闭监听句柄了,才真的老的worker才不做处理了。

然后quit之后,master 会有一个定时器,如果worker 还没有退出,那么master 会强制杀死worker进程。

热升级流程:

  1. 将旧的nginx 换成新的nginx 文件

  2. 向master 进程发送usr2信号

  3. master 进程修改pid 文件名,加后缀.oldbin

  4. master进程用新的nginx 文件启动新的master 进程

  5. 向老的master 进程发送winch信号,关闭老的worker

  6. 回滚:向老的master 发送hup,想新的master 发送quit。

优雅退出worker 过程:

  1. 设置定时器 worker_shutdown_timeout

  2. 关闭监听句柄

  3. 关闭空闲链接

  4. 在循环中等待全部连接关闭

  5. 退出进程

这个循环中等待全部连接关闭,可能很长时间,如果到达了worker_shutdown_timeout设置的时间,那么也会被强制关闭。

下一届介绍nginx的网络模型。

nginx重新整理——————nginx 的设计模型[八]的更多相关文章

  1. 用lua扩展你的Nginx(整理)-----openresty

    用lua扩展你的Nginx(整理) 首先得声明.这不是我的原创,是在网上搜索到的一篇文章,原著是谁也搞不清楚了.按风格应该是属于章亦春的文章. 整理花了不少时间,所以就暂写成原创吧. 一. 概述 Ng ...

  2. 用lua扩展你的Nginx(整理)

    首先得声明.这不是我的原创,是在网上搜索到的一篇文章,原著是谁也搞不清楚了.按风格应该是属于章亦春的文章. 整理花了不少时间,所以就暂写成原创吧. 一. 概述 Nginx是一个高性能.支持高并发的,轻 ...

  3. nginx的入门到框架设计

    mac上安装nginx 安装与启动 安装 brew install nginx 命令 通过 Homebrew 下载的软件默认位置在 /usr/local/Cellar 应该ln-s 加连接就能全局 n ...

  4. [转帖]nginx基础整理

    nginx基础整理 https://www.cnblogs.com/guigujun/p/6588545.html 目录结构如下: Nginx基础知识 Nginx HTTP服务器的特色及优点 Ngin ...

  5. linux C++ 通讯架构(一)nginx安装、目录、进程模型

    nginx是C语言开发的,号称并发处理百万级别的TCP连接,稳定,热部署(运行时升级),高度模块化设计,可以用C++开发. 一.安装和目录 1.1 前提 epoll,linux内核版本为2.6或以上 ...

  6. Nginx基础整理

    目录结构如下: Nginx基础知识 Nginx HTTP服务器的特色及优点 Nginx的主要企业功能 Nginx作为web服务器的主要应用场景包括: Nginx的安装 安装环境 快速安装命令集合 各个 ...

  7. 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]

    菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  8. Nginx详解二十八:Nginx架构篇Nginx+Lua的安全waf防火墙

    Nginx+Lua的安全waf防火墙 看一下别人写好的:https://github.com/loveshell/ngx_lua_waf 先安装git:yum -y install git 在/opt ...

  9. 一:Nginx知识整理

    Nginx与服务器集群 一:集群 1.什么是集群 集 合在一起 放在一起 群 一堆 很多 服务器架构集群:多台服务器组成的响应大并发,高数据量访问的架构体系. 分布式服务器架构: 特点: 1)成本高 ...

  10. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

随机推荐

  1. Java面试必考题之线程的生命周期,结合源码,透彻讲解!

    写在开头 在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用.创建方式.重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了. 第一个需要学的就是线程的生命周期,也可以将之理 ...

  2. Java解析JSON数据,有回车符\n时解析报错

    一.问题由来 测试人员最近在测试时,后台日志一直抱错,大致意思是JSON数据解析错误,错误信息如下: 二.问题分析 去查看代码时,发现异常信息是这里抛出来的,解析时使用的是json-lib这个包中的方 ...

  3. 后端基础PHP-PHP简介及基本函数

    后端基础PHP-PHP简介及基本函数 1.PHP简单介绍 2.PHP基本语法 一.PHP简单介绍 PHP(超文本预处理器),是一种通用的开源脚本语言,标准的后端语言 比较常见的后端语言,ASP|ASP ...

  4. socket本地通信服务端

    #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <str ...

  5. 熬夜的JaVa

    1 import java.util.Scanner; 2 3 public class viovo { 4 static int number = 5;//五个商品信息 5 static oppo[ ...

  6. 引领汽车营销新趋势,3DCAT实时云渲染助力汽车三维可视化

    当前,汽车产业发展正从电动化的上半场,向智能化的下半场迈进.除了车机技术体验的智能化之外,观车体验的智能化也不容忽视. 这是因为,随着数字化.智能化.个性化的趋势,消费者对汽车的需求和期待也越来越高, ...

  7. .NET集成DeveloperSharp操作Sql Server数据库

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. 本文提供了一种结合"原生Sql+轻量级ORM"操 ...

  8. 【LeetCode刷题】剑指Offer 48.最长不含重复字符的子字符串

    剑指Offer 48.最长不含重复字符的子字符串(点击跳转LeetCode) 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcab ...

  9. Csharp中表达式树

    Csharper中的表达式树 这节课来了解一下表示式树是什么? 在C#中,表达式树是一种数据结构,它可以表示一些代码块,如Lambda表达式或查询表达式.表达式树使你能够查看和操作数据,就像你可以查看 ...

  10. GIT版本控制学习博客

    GIT版本控制学习博客 环境部署 下载git版本控制即可. 用户配置 (1)设置用户及地址 git config --global user.name "Username" git ...