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 工作进程.