php-cgi使用过程有个疑惑,大牛们帮忙解惑一下。
假设场景如下:
nginx 监听 192.168.1.101:80,没有php环境
index.php 192.168.1.101::/dev/shm/index.php
php-fpm监听 192.168.1.102:90000
存在的困惑是,index.php 在运行过程中,是在 192.168.1.101 进行解析运行,还是发送到 192.168.1.102 解析运行?详细的过程哪个大牛来给解惑一下?
如果是在 1.102 解析运行,一旦碰到phar这种比较大的代码包或者单个较大的php文件,是否是整个包一起发送过去?内网流量是不是很可观的样子?
监听 192.168.1.101:80 的 Nginx 通过 fastcgi_pass 把 PHP 请求分发到 PHP-FPM 监听的 192.168.1.102:9000 , PHP-FPM 根据 Nginx 请求, 解析 Nginx 传过来的这个参数 $_SERVER['SCRIPT_FILENAME'] 指定的 PHP 文件, PHP-FPM 工作进程内部的 PHP 解释器执行完脚本后把结果通过局域网返回给 Nginx.
Nginx 和 PHP-FPM 进程间采用了 TCP 网络通信, 而 MOD_PHP 这种把 PHP 解释器作为一个模块集成到 Apache 进程(线程)内部运行的模式是完全不同的, 通过 Nginx 的 upstream, 很容易实现 PHP-FPM 集群和高可用.
另外:
Apache 通过 mod_fastcgi 模块可以搭配 PHP-FPM 使用, 这时建议 Apache 使用 event MPM 这个多进程多线程 epoll 事件驱动的 MPM. PHP-FPM 则采用默认的非线程安全版本, 更高效和稳定.
Apache 通过 mod_fcgid 模块可以搭配 PHP-CGI 使用, 建议同上.
注意到, Apache 的 mod_fastcgi 模块类似于 Nginx 提供的 fastcgi 支持, 功能跟 mod_fcgid 不一样, 比mod_fcgid 高效, 因为 mod_fcgid 需要自己管理 PHP-CGI 进程,而 mod_fastcgi 下,是 PHP-FPM 主进程管理自己的 FPM 工作进程.
感谢 @白一梓,@eechen 两位大拿的回答,其实问这个问题,想了解的是192.168.1.102 这个机器上是否需要布php脚本。因为之前主要用的是apache,很少用到php-fpm~
刚刚自己找了两台服务器搭了一下环境,大概理解了。
其实 php-fpm 只是接收到 nginx 传过来的header,也就是fastcgi_param,然后找到 SCRIPT_FILENAME 之后,从1.102 自身硬盘上加载脚本并执行,也就是 nginx 和 php-fpm 传输的过程,只是 header,与脚本无关,然后通过 header 跟apache一样执行php代码~
也就是,抛开apache的其他高级功能以及内部运行原理不谈,nginx + php-fpm 和 nginx + apache 在运行的流程上是基本一样的~~
这个,我在问题/q/1010000002753412 中已经给出答案了,我的回答中给出了流程图,应该很容易理解