【Nginx-反向代理server】基础知识(二)之多进程模式
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】基础知识(二)之多进程模式的更多相关文章
- nginx反向代理部署与演示(二)
我们把LB01作为负载均衡器,WEB01和WEB02作为两台web服务器. WEB01与WEB02虚拟主机配置如下: 我们修改nginx下的conf/nginx.conf文件,在http{}中 ...
- Linux 笔记 - 第二十章 配置 Nginx 反向代理和负载均衡
一.简介 由于 Nginx 的反向代理和负载均衡功能经常被提及,所以将这两个功能单独提出来进行讲解. Nginx 其实仅仅是作为 Nginx Proxy 反向代理使用的,因为这个反向代理功能表现的效果 ...
- CentOS 7 学习(二) 配置Nginx反向代理
CentOS 7 学习(二) 配置Nginx反向代理 Nginx可以通过php-fpm来运行PHP程序,也可以转向apache,让apache调用php程序来运行. 不过对于Nginx来说,其反向代理 ...
- 【netcore基础】CentOS 7.6.1810 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动
之前写过一篇Ubuntu的环境搭建博客,感觉一些配置大同小异,这里重点记录下 nginx 作为静态 angular 项目文件服务器的配置 参考链接 [netcore基础]ubuntu 16.04 搭建 ...
- Linux基础-----------nginx安装和nginx web、nginx反向代理、nfs 服务
作业一:nginx服务1)二进制安装nginx包 yum install epel-release -y 先安装epel-release 再查看yum源中已经安装上了epel相关文件 中间省去了一些安 ...
- tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控
tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...
- Nginx反向代理与负载均衡应用实践(二)
Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...
- 高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理
一.搭建Nginx服务器 目标: 在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能: 1> SSL加密功能 2> 设置Ng ...
- nginx反向代理cas server之1:多个cas server负载均衡配置以及ssl配置
系统环境采用centOS7 由于cas server不支持session持久化方式的共享,所以请用其他方式代替,例如:组播复制. 为什么不支持session持久化:http://blog.csdn.n ...
- (二)Nginx反向代理与负载均衡的实现
引言:nginx正向代理与反向代理在上一篇文章中已经谈论过,这里狗尾草主要告诉大家Nginx对前端的小伙伴来说在工作中如何简单的使用. 1.0什么是反向代理 当我们有一个服务器集群,并且服务器集群中的 ...
随机推荐
- Codeforces 702 D Road to Post Office
题目描述 Vasiliy has a car and he wants to get from home to the post office. The distance which he needs ...
- python3全栈开发-并发编程,多线程
一.什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...
- 显示ACSII码字符表 Exercise05_15
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:显示ACSII码字符表 * */ public class Exercise05_15 { public static voi ...
- 修复XCode7 Beta版无法使用iOS8.4真机调试的Bug
在XCode7 Beta2下如果使用iOS8.4版的真机进行调试,XCode会提示: "Could not find Developer Disk Image" 解 ...
- winform 窗体实现增删改查(CRUD)共用模式
转载:http://www.csframework.com/archive/2/arc-2-20110617-1632.htm 高度封装的编辑窗体 http://www.cnblogs.com/wuh ...
- 开源的库RestSharp轻松消费Restful Service
现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理 ...
- [Java基础] java多线程关于消费者和生产者
多线程: 生产与消费 1.生产者Producer生产produce产品,并将产品放到库存inventory里:同时消费者Consumer从库存inventory里消费consume产品. 2.库存in ...
- u-boot修改出错的问题
一.u-boot找不到nandflash 我用的开发板是fl2440的,里面没有norflash只有nandflash.我用了s3c2410的u-boot改的,所以要把内核从norflash启动改成适 ...
- 计算两个经纬度之间的距离(python算法)
EARTH_REDIUS = 6378.137 def rad(d): return d * pi / 180.0 def getDistance(lat1, lng1, lat2, lng2): r ...
- 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结
匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...