当前位置:首页 > 计算机科学 > 网络技术 > 正文内容

Nginx+PHP-FPM运行机制

fanglong2020-08-05网络技术1622

CGI

common gateway interface (公共网关接口)

请求模式:
    Web Brower(浏览器) ----(通过http协议传输)----> Http Server(服务器nginx/apache) -----> CGI Program -----> Db

Server 与 CGI 通过 STDIN/STDOUT(标准的输入/输出)进行数据传递
nginx(动态加载模块) apache(指定加载模块)

CGI工作原理

每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),
CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。
当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不 适合了。于是就有了fastcgi。

FastCGI

像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,
不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。

一般情况下,FastCGI的整个工作流程是这样的:
    1.Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
    2.FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
    3.当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
    4.FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。
      当FastCGI子进程关闭连接时, 请求便告处理完成。
      FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 
      在CGI模式中,php-cgi在此便退出了。

php-fpm(PHP内置的一种fast-cgi)

php-fpm即php-Fastcgi Process Manager.
php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),
每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

请求步骤

Web Brower(浏览器访问) www.example.com
|
        |
   通过http协议传输  
|
        |
    http server
 (服务器nginx/apache)            
|
        |
     配置解析    
路由到 www.example.com/index.php
|
        |
加载 nginx 的 fast-cgi 模块
|
        |
fast-cgi 监听 127.0.0.1:9000 地址
通过 fast-cgi 协议将请求转发给 php-fpm 处理
|
        |
请求到达 127.0.0.1:9000
|
        |
php-fpm 监听 127.0.0.1:9000
可通过 php-fpm.conf 进行修改

所以并发量大之后可以分离或者负载均衡

数据库 Web服务器 php-fpm

php-fpm is not avaliable on Windows, but you can use IIS or Apache as the "fastcgi process manager".
If you have to use Nginx, here is a solution. Nginx provides a load balancing module. We can distribute the request to different php-cgi.exe process.

<http://nginx.org/en/docs/http/load_balancing.html >
<http://nginx.org/en/docs/http/ngx_http_upstream_module.html >

This is the origin nginx conf.
```
location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}
```

You can replace it by
```
upstream php {
    server  127.0.0.1:9000 weight=1;
    server  127.0.0.2:9001 weight=2;
    server  127.0.0.3:9002 weight=3;
    server  127.0.0.4:9003 weight=4;
}

location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  php;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}
```

CAUTION!!

php-cgi.exe process will die after several requests, so you have to restart the php-cgi.exe manually to keep a process listening the port.

DON'T USE THIS SOLUTION IN PRODUCTION!!

扫描二维码推送至手机访问。

版权声明:本文由人从众的博客发布,如需转载请注明出处。

本文链接:https://loulin.bid/10.html

分享给朋友:

相关文章

Centos7中添加、删除Swap交换分区的方法

Swap空间的作用是当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。这篇文章主要给大家介绍了关于Centos7中添加、删除Swap交换分区的相...

nginx报错[warn] the “ssl” directive is deprecated的解决办法

最近在复制旧机器上的nginx.conf配置文件到新机器上的时候,重启后出现这么一个报错.nginx: [warn] the “ssl” directive is deprecated, use th...

php 编译安装插件提示PHP Warning: PHP Startup: Unable to load dynamic library 报错

又或如: cannot open shared object file: No such file or directory in Unknown on line 0 PHP message...

优化 CentOS 7,减少无用的写入动作延长 SSD 使用寿命

 禁用文件最后访问时间编辑 /etc/fstab 文件,为其中所有 xfs 的分区添加挂载参数。将类似以下的配置......    xfs  ...

把你的网站搬回家吧!(第一版2015年)

适用于上网有公网IP分配的人,移动可以申请光纤,电信,联通一般只封掉80和8080.所以443大有可为!免费申请SSL证书地址:1.StartSSL(https://www.startssl.com/...

评论列表

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。