FastCGI特點原理、nginx與php-fpm兩種通訊方式對比
一、FastCGI特點:
1、HTTP伺服器和動態指令碼語言間通訊的介面或工具
2、可把動態語言解析和HTTP伺服器分離I
3、Nginx、Apache、Lighttpd,以及多數動態語言 都支援FastCGI
4、FastCGI介面方式採用 C/S結構,分為客戶端(HTTP伺服器)和伺服器端(動態語言解析伺服器)
5、PHP動態語言伺服器可以啟動多個FastCGI的守護程序(例如php-fpm(fcgi process mangement))
6、HTTP伺服器通過 FastCGI客戶端(Nginx fastcgi_pass)和 動態語言FastCGI伺服器(php-fpm) 通訊
二、FastCGI原理:
FastCGI介面在Linux下是socket。wrapper 用於啟動另一個程式,繫結在某個固定的socket上,如埠或檔案socket。呼叫CGI程式
1、Nginx將CGI請求傳送給繫結有wrapper的socket時,通過FastCGI介面,wrapper接收到請求,然後派生出一個新的執行緒,這個執行緒呼叫直譯器 或者 外部程式 處理指令碼 來讀取返回的資料。
2、wrapper再將返回的資料通過FastCGI介面,沿著固定的socket傳給Nginx
3、Nginx將返回的資料傳送給客戶端n
三、nginx與php-fpm兩種通訊方式
unix socket方式要比tcp的方式快,而且消耗資源少,因為socket之間在nginx和php-fpm的程序之間通訊,而tcp需要經過本地迴環驅動,還要申請臨時埠和tcp相關資源。
unix socket會顯得不是那麼穩定,當併發連線數爆發時,會產生大量的長時快取,在沒有面向連線協議支撐的情況下,大資料包很有可能就直接出錯並不會返回異常。而TCP這樣的面向連線的協議,多少可以保證通訊的正確性和完整性。
1、tcp方式
#PHP 指令碼請求全部轉發到 FastCGI處理. 使用FastCGI預設配置. location ~ \.php$ { root /root; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
location ~ \.php$ { root /root; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } tips:diff fastcgi.conf fastcgi_params fastcgi.conf多了一行fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
2、unix socket方式
location ~ \.php$ { # fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www/nginx-default$fastcgi_script_name; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
tips:修改nginx配置檔案location ~ \.php$ 區段之後,記得修改/etc/php5/fpm/pool.d/www.conf 的 listen = 127.0.0.1:9000 或者 listen = unix:/var/run/php5-fpm.sock
參考文件: