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. [Baltic2003] Gem

    [Baltic2003]Gem Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 501  Solved: 320[Submit][Status][Discu ...

  2. 【左偏树】BZOJ2809-[APIO2012]dispatching

    [题目大意] 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同 ...

  3. STL之vector4

    描述 将一个n行m列矩阵元素输入存储后并输出. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { vector< vector<int> > ...

  4. a + b ——C语言初学者百题大战之四

    #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf(" ...

  5. GLEW扩展库【转】

    http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html 一.关于GLEW扩展库: GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用O ...

  6. edittext SearchView 失去焦点问题

    edittext 默认自己主动获取焦点的 并且会出现小键盘非常烦人 <LinearLayout             android:id="@+id/focus"     ...

  7. Scala 将BigDecimal转换为Long

    待转换.asInstanceOf[Number].longValue (Double转为Long也适用)

  8. Windows下编译vpx获得各个项目VS2010解决方案的步骤

    最近研究了一下几种常见的视频编码器:x264,x265,vpx.本文简单记录一下它们的编译方法. x264,x265,vpx这三个开源的视频编码器可以说是当今“最火”的视频编码器.x264现在占据着H ...

  9. Java定时任务的三种实现方法

    译者注:个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据.文件等.在本文里,我会给大家介绍3种不同的实现方法:1.普通thre ...

  10. vlan 介绍

    简介      在Linux中安装了802.1Q标签VLAN功能.VLAN是虚拟分配以太网的功能. 使用VLAN ID从物理上将一个以太网分割开.在VLAN环境下,具有相同VLAN ID 就可以相互通 ...