php-cgi使用過程有個疑惑,大牛幫忙解惑。
假設場景如下:
nginx 監聽 192.168.1.101:80,沒有php環境
index.php 192.168.1.101::/dev/shm/index.php
存在的困惑是,index.php 在運行過程中,是在 192.168.1.101 進行解析運行,還是送到 192.168.1.102 解析運行?詳細的過程哪個大牛來給解惑一下?### ###如果是在 1.102 解析運行,一旦碰到phar這種比較大的程式碼包或單一較大的php文件,是否是整個包一起發送過去?內網流量是不是很可觀的樣子? ###
仅有的幸福2017-05-16 17:25:26
監聽192.168.1.101:80 的Nginx 透過fastcgi_pass 把PHP 請求分發到PHP-FPM 監聽的192.168.1.102:9000 , PHP-FPM 根據Nginx 請求, 解析Nginx 傳過來的這個參數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 下,是PHPFPM 主進程管理自己的M 工作進程.
天蓬老师2017-05-16 17:25:26
感謝 @白一梓,@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 在運作的流程上是基本上一樣的~~