Nginx+Php-fpm运行原理详解

php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似。master进程主要负责CGI及PHP环境初始化、事件监听、子进程状态等等, worker进程负责处理php请求。

master只是负责管理工作,并不是很多人认为的把客户端发来的请求分给worker进程处理,而是由worker进程负责客户端的请求监听和处理, master只负责管理worker,如重启,重新加载配置文件,并不会派发请求。

一旦kill掉worker进程后,会重启一个新的worker进程。因此客户端请求肯定会得到响应处理。这进一步验证了的上面的结论,master进程负责监听子进程的状态,子进程挂掉之后,会发信号给master进程,然后master进程重新启一个新的worker进程。

worker是同步阻塞,必须等这次处理完,才会处理其它请求,并发性能不行.

nginx与php-fpm的结合,完整的流程是这样的。

 www.example.com
        |
        |
      Nginx
        |
        |
路由到www.example.com/index.php
        |
        |
加载nginx的fast-cgi模块
        |
        |
fast-cgi监听127.0.0.1:9000地址
        |
        |
www.example.com/index.php请求到达127.0.0.1:9000
        |
        |
php-fpm 监听127.0.0.1:9000
        |
        |
php-fpm 接收到请求,启用worker进程处理请求
        |
        |
php-fpm 处理完请求,返回给nginx
        |
        |
nginx将结果通过http返回给浏览器 

1.传统php-fpm工作模式的问题

1、Fastcgi进程管理器,实现fastcgi协议
2、同步阻塞IO进程模型
3、请求结束后释放所有资源和内存
4、并发受限于进程数
5、PHP框架初始化占用大量的计算资源

2. php-fpm工作模式的问题

1、nginx基于epoll事件模型,一个worker同时可处理多个请求
2、fpm-worker在同一时刻可处理一个请求
3、master进程只负责处理worker进程的监控、日志等
4、用户端请求由elb解析,再经过nginx解析
5、fpm-worker每次处理请求前需要重新初始化mvc框架,然后再释放资源
6、高并发请求时,fpm-worker不够用,nginx直接响应502
7、fpm-worker进程间切换消耗大(如某线上业务在4核8G内存服务器实质可利用16个进程)

你可能感兴趣的:(php)