如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了 。
worker进程:而基本的网络事件,则是放在worker进程中来处理了 。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求 。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。
worker进程之间是平等的,每个进程,处理请求的机会也是一样的 。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程 。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接 。
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了 。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理 。
worker进程之间是平等的,每个进程,处理请求的机会也是一样的 。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程 。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接 。
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了 。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理 。
三. Nginx+FastCGI运行原理1、什么是 FastCGIFastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口 。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等 。同时,FastCGI也被许多脚本语言支持,其中就有php 。
FastCGI是从CGI发展改进而来的 。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后将结果返回给HTTP服务器 。这在处理高并发访问时几乎是不可用的 。另外传统的CGI接口方式安全性也很差,现在已经很少使用了 。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程 。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器 。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能 。
2、Nginx+FastCGI运行原理Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用 。FastCGI接口在linux下是socket(这个socket可以是文件socket,也可以是ip socket) 。
wrApper:为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket 。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据(html页面或者图片)发送给客户端 。
这就是Nginx+FastCGI的整个运作过程,如图所示 。
推荐阅读
- 5分钟学会从此不违章! 交通图解
- 离职要懂得维权!一文让你彻底搞懂经济补偿的N、N+1、2N、2N+1
- 2步搞定抖音怎么把抖音标志去掉,简简单单
- 苹果手机照片彻底删除后怎么恢复?照片误删这样恢复
- 三个步骤帮你轻松搞定微信公众号平台!
- 6分钟教你彻底理解三原色的色彩原理,轻松模仿各路大神作品色调
- 简单直接。一文搞懂医疗险
- 是玉帝的女儿还是妹妹?《西游记》可能搞错了 二郎神的母亲
- 彻底弄懂UTF-8、Unicode、宽字符、locale
- 一文搞懂什么是 C# 计时器!
