【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 8D] Two Friends
Brief Introduction: 有两人a.b,他们都在A点,a经过B点到C点,而b直接到C点.a走过的距离不超过la,b走过距离不超过lb,询问他们可能经过最长的公共距离. Algorithm ...
- 【主席树】bzoj2588 Spoj 10628. Count on a tree
每个点的主席树的root是从其父转移来的.询问的时候用U+V-LCA-FA(LCA)即可. #include<cstdio> #include<algorithm> using ...
- 前端基础-JavaScript的基本概述和语法
1.JavaScript概述 2.JavaScript引入方式 3.JavaScript语言规范 4.JavaScript语言基础 5.JavaScript数据类型 6.JavaScript运算符 7 ...
- [CF160D]Edges in MST
[CF160D]Edges in MST 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le10^5)\)条边的连通图.对于图中的每条边,判断它与该图最小生成树的关系: 在该图所有的 ...
- Java高级架构师(一)第25节:实现前端的业务登录等功能
package com.sishuok.architecture1; import javax.servlet.http.Cookie; import javax.servlet.http.HttpS ...
- MJExtension使用指导(转)
MJExtension使用指导(转) MJExtension能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) --& ...
- Step by Step 使用HTML5开发一个星际大战游戏(2)
HTML5 Canvas Game: 玩家飞船 本系列博文翻译自以下文章 http://blog.sklambert.com/html5-canvas-game-the-player-ship/ L ...
- 现在就可以使用的5个 ES6 特性
小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...
- 消息队列系列(三):.Rabbitmq Trace的使用
一.什么是Trace Trace是Rabbitmq用于记录每一次发送的消息,方便使用Rabbitmq的开发者调试.排错.可通过插件形式 提供可视化界面 二.Trace实现概况 ...
- Android ProgressBar手动控制开始和停止
这两天有个需求,点击按钮从SD卡解压压缩包,并读取压缩包内txt文档内容,然后在街面上显示出来.毕竟IO操作很耗时,如果文件较大会花费不少时间.所以,在处理数据的时候能给个进度就好了.我们通常的做法就 ...