网站开发的书,wordpress手机版弹出式导航,设计在线中国,自己做的网站什么时候可以赚钱一#xff0c;Nginx是异步非阻塞多进程#xff0c;io多路复用 1、master进程#xff1a;管理进程 master进程主要用来管理worker进程#xff0c;具体包括如下4个主要功能#xff1a; #xff08;1#xff09;接收来自外界的信号。 #xff08;2#xff09;向各worker进…一Nginx是异步非阻塞多进程io多路复用 1、master进程管理进程 master进程主要用来管理worker进程具体包括如下4个主要功能 1接收来自外界的信号。 2向各worker进程发送信号。 3监控woker进程的运行状态。 4当woker进程退出后异常情况下会自动重新启动新的woker进程。 2、worker进程处理请求 而基本的网络事件则是放在worker进程中来处理了。多个worker进程之间是对等的他们同等竞争来自客户端的请求各进程互相之间是独立的。一个请求只可能在一个worker进程中处理一个worker进程不可能处理其它进程的请求。worker进程的个数是可以设置的一般我们会设置与机器cpu核数一致这里面的原因与nginx的进程模型以及事件处理模型是分不开的。 worker进程之间是平等的每个进程处理请求的机会也是一样的。当我们提供80端口的http服务时一个连接请求过来每个进程都有可能处理这个连接怎么做到的呢 Nginx采用异步非阻塞的方式来处理网络事件类似于Libevent具体过程如下 1接收请求首先每个worker进程都是从master进程fork过来在master进程建立好需要listen的socketlistenfd之后然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读每个work进程都可以去accept这个socketlistenfd。当一个client连接到来时所有accept的work进程都会受到通知但只有一个进程可以accept成功其它的则会accept失败。 2处理请求当一个worker进程在accept这个连接之后就开始读取请求解析请求处理请求产生数据后再返回给客户端最后才断开连接这样一个完整的请求就是这样的了 我们可以看到一个请求完全由worker进程来处理而且只在一个worker进程中处理。worker进程之间是平等的每个进程处理请求的机会也是一样的。
虽然nginx采用多worker的方式来处理请求每个worker里面只有一个主线程那能够处理的并发数很有限啊多少个worker就能处理多少个并发何来高并发呢非也这就是nginx的高明之处nginx采用了异步非阻塞的方式来处理请求也就是说nginx是可以同时处理成千上万个请求的。一个worker进程可以同时处理的请求数只受限于内存大小Worker 进程 不再同步阻塞的去处理一个请求而是可以同时处理多个请求无需 I/O 等待。请求r1-1,r1-2,r1-2都再在woker1进程中如果r1-1发生阻塞需要等待worker1就会去处理r1-2,等到r1-1处理好了由事件通知再将结果返回。
二php-fpm是阻塞式单线程模型 客户端发送的请求到达nginx后nginx会解析后转发给php-fpm进程管理器php-fpm在master进程中创建多个work进程调用一个work进程处理php代码。有请求到达work后阻塞在fcgi_accept_request()上各自accept请求然后处理这期间是不会接收其他请求的也就是说work进程同时只能响应一个请求只有把这个请求处理完了才会处理下一个。如果所有的work都处于忙碌状态阻塞那么这些请求就会阻塞在master进程上。所有work均是抢占模式来处理请求。抢占模式每个进程都可以得到一定CPU时间片的时间处理时间片结束或是进程发生阻塞数据库连接、网络请求I/O如发送短信、邮件第三方接口、读写文件、sleep等待就会触发上下文切换CPU会经由调度程序去处理下一个进程的内容。等待阻塞结束再将进程由阻塞态加入就绪态队列此时的进程处于就绪队列高等级等待cpu调度执行。php从代码级别的执行上是单线程的, 但是由php-fpm进程管理机制是多进程单线程的, 也就是php是多进程执行的. 有效提高并发的响应效率。