Nginx的多进程模式

nginx在启动后。会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包括:接收来自外界的信号。向各worker进程发送信号,监控worker进程的执行状态,当worker进程退出后(异常情况下),会自己主动又一次启动新的worker进程。而主要的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的。他们同等竞争来自client的请求,各进程互相之间是独立的。一个请求。仅仅可能在一个worker进程中处理,一个worker进程,不可能处理其他进程的请求。worker进程的个数是能够设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

nginx的进程模型。能够由下图来表示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

在nginx启动后,假设我们要操作nginx,要怎么做呢?

从上文中我们能够看到,master来管理worker进程,所以我们仅仅须要与master进程通信即可了。master进程会接收来自外界发来的信号,再依据信号做不同的事情。

所以我们要控制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进程发送信号一样了。

如今,我们知道了当我们在操作nginx的时候,nginx内部做了些什么事情,那么,worker进程又是怎样处理请求的呢?

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

我们能够看到,一个请求,全然由worker进程来处理,并且仅仅在一个worker进程中处理。

那么,nginx採用这种进程模型有什么优点呢?

当然,优点肯定会非常多了。首先,对于每一个worker进程来说,独立的进程。不须要加锁。所以省掉了锁带来的开销,同一时候在编程以及问题查找时,也会方便非常多。其次,採用独立的进程,能够让互相之间不会影响。一个进程退出后,其他进程还在工作。服务不会中断。master进程则非常快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的全部请求失败,只是不会影响到全部请求,所以减少了风险。当然,优点还有非常多。大家能够慢慢体会。

总结:

当然Nginx之所以如此高性能,还有例如以下的原因:
1,nginx代理和后端webserver间无需长连接
2。接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送给后端server。极大的减轻后端webserver压力
3。发送响应报文时,是边接收来自后端webserver的数据,边发送给client的
4,对网络依赖性低,理论上讲。仅仅要能够ping通就能够实施负载均衡

5,支持server检測。nginx能够依据应用server处理页面返回的状态码,超时信息等检測server是否出现问题,并及时返回错误请求又一次提交到其他节点上。

【Nginx-反向代理server】基础知识(二)之多进程模式的更多相关文章

  1. nginx反向代理部署与演示(二)

    我们把LB01作为负载均衡器,WEB01和WEB02作为两台web服务器.   WEB01与WEB02虚拟主机配置如下:   我们修改nginx下的conf/nginx.conf文件,在http{}中 ...

  2. Linux 笔记 - 第二十章 配置 Nginx 反向代理和负载均衡

    一.简介 由于 Nginx 的反向代理和负载均衡功能经常被提及,所以将这两个功能单独提出来进行讲解. Nginx 其实仅仅是作为 Nginx Proxy 反向代理使用的,因为这个反向代理功能表现的效果 ...

  3. CentOS 7 学习(二) 配置Nginx反向代理

    CentOS 7 学习(二) 配置Nginx反向代理 Nginx可以通过php-fpm来运行PHP程序,也可以转向apache,让apache调用php程序来运行. 不过对于Nginx来说,其反向代理 ...

  4. 【netcore基础】CentOS 7.6.1810 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    之前写过一篇Ubuntu的环境搭建博客,感觉一些配置大同小异,这里重点记录下 nginx 作为静态 angular 项目文件服务器的配置 参考链接 [netcore基础]ubuntu 16.04 搭建 ...

  5. Linux基础-----------nginx安装和nginx web、nginx反向代理、nfs 服务

    作业一:nginx服务1)二进制安装nginx包 yum install epel-release -y 先安装epel-release 再查看yum源中已经安装上了epel相关文件 中间省去了一些安 ...

  6. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...

  7. Nginx反向代理与负载均衡应用实践(二)

    Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...

  8. 高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理

    一.搭建Nginx服务器 目标: 在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能: 1> SSL加密功能 2> 设置Ng ...

  9. nginx反向代理cas server之1:多个cas server负载均衡配置以及ssl配置

    系统环境采用centOS7 由于cas server不支持session持久化方式的共享,所以请用其他方式代替,例如:组播复制. 为什么不支持session持久化:http://blog.csdn.n ...

  10. (二)Nginx反向代理与负载均衡的实现

    引言:nginx正向代理与反向代理在上一篇文章中已经谈论过,这里狗尾草主要告诉大家Nginx对前端的小伙伴来说在工作中如何简单的使用. 1.0什么是反向代理 当我们有一个服务器集群,并且服务器集群中的 ...

随机推荐

  1. 小型Web应用扫描工具Grabber

    小型Web应用扫描工具Grabber   Grabber是Kali Linux集成的一款Web应用扫描工具.该工具适合中小Web应用,如个人博客.论坛等.该工具使用Python语言编写,支持常见的漏洞 ...

  2. NOIP 2015 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...

  3. NOIP2010关押罪犯

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  4. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

  5. Java高级架构师(一)第16节:Mybatis动态查询和Json自动拼装

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  6. cookie的secure、httponly属性设置

    cookie的secure.httponly属性设置 转载自:http://www.cnblogs.com/alanzyy/archive/2011/10/14/2212484.html 一.属性说明 ...

  7. 对list_entry(ptr, type, member)的理解

    如何根据一个结构体成员的地址.结构体类型以及该结构体成员名获得该结构体的首地址? #define list_entry(ptr, type, member) \ ((type *)((char *)( ...

  8. mac 下安装 mysql (蛋疼)

    mac先安装mydql步骤 1.首先从官网上下载 mac版本的mysql:我的是mysql-5.7.20-macos10.12-x86_64.dmg 2.正常安装: 3.在系统偏好设置的最底下.1:是 ...

  9. redis push/pop(List)的17条命令

    一.Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. ...

  10. python 输出所有大小写字母, range()以及列表切片

    所以在写的时候,只要把它们的ASCII列出,并转化成字符型chr 即可. print [chr(i) for i in range(65,91)]#所有大写字母 print [chr(i) for i ...