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. 微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  2. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  3. SpingMVC实现操作的第一方式

    (一) 使用SpringMVC框架的步骤 (1):在web.xml中配置前端控制器 (2):在Spring-servlet.xml中配置 配置处理器映射器HandlerMapping(处理器Handl ...

  4. Swift中的GCD——常见的dispatch方法

    什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...

  5. Matlab中struct的用法

    struct在matlab中是用来建立结构体数组的.通常有两种用法: s = struct('field1',{},'field2',{},...)  这是建立一个空的结构体,field1,field ...

  6. 推荐一些不错的开源免费易上手的web前端框架

    1. bui 2.Semantic UI 3.oniui

  7. 【java】递归统计本地磁盘所有文件,提取重复文件,JDK8 map迭代

    package com.sxd.createDao; import java.io.File; import java.time.LocalDateTime; import java.util.Has ...

  8. sqlserver 删除临时表

    sqlserver 删除临时表 if object_id('tempdb..#tempTable') is not null Begin drop table #tempTable End

  9. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

  10. 深入理解AMD和RequireJS!

    AMD 基于commonJS规范的nodeJS出来以后,服务端的模块概念已经形成,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行.但是,由于一个重大 ...