1、什么是CGI
CGI全稱是“公共網關接口”(Common Gateway Interface),http服務器與你的或其他機器上的程序進行“交談”的一種工具,CGI程序須運行在網絡服務器上。
傳統CGI接口方式的主要缺點是性能很差,因為每次http服務器遇到動態程序時都需要重新啟動腳本解析器來執行解析,然后結果被返回給http服務器,這在處理高并發訪問時,幾乎是不可用的,因此就誕生了FastCGI。另外傳統的CGI接口方式安全性也很差,現在已經很少被使用了。
2、什么是FastCGI
FastCGI是一個可伸縮地、高速地在http server和動態腳本語言間通信的接口(FastCGI接口在Linux下是socket,這個socket可以是文件socket,也可以是ip socket),主要優點是把動態語言和HTTP Server分離開來。多數流行的HTTP server都支持FastCGI包括Nginx和Lighttpd等,同時FastCGI也被許多腳本語言所支持,其中就有PHP。FastCGI接口方式采用C/S結構,可以將http服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。當http服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓http服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
3、Nginx下FastCGI運行原理

Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket(這個socket可以是文件socket,也可以是IP socket)。為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接納到請求,然后派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數據,接著,wrapper再將返回的數據通過FastCGI接口,沿著固定的socket傳遞給Nginx,最后Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運作過程。
4、優化php-fpm進程管理配置參數。
php-fpm的編譯參數:
php5.3及以上版本編譯參數為”–enable-fpm”
php5.2及以下版本編譯參數為”–enable-fastcgi –enable-fpm –enable-force-cgi”
#php-fpm.conf配置文件參數優化選項。
pm.max_children = 1024 #子進程最大數
pm.start_servers = 16 #啟動時的進程數
#保證空閑進程數最小值,如果空閑進程小于此值,則創建新的子進程
pm.min_spare_servers = 5
#保證空閑進程數最大值,如果空閑進程大于此值,則進行清理
pm.max_spare_servers = 20
#進程的超時時間
pm.process_idle_timeout = 15s
#設置每個子進程處理的最大請求數
pm.max_requests = 1000
#設置文件打開描述符的rlimit限制
rlimit_files = 1024
#當一個請求該設置的超時時間后,就會將對應的PHP調用堆棧信息完整寫入到慢日志中. 設置為 ‘0’ 表示 ‘Off’
request_slowlog_timeout = 10s
#慢請求的記錄日志,配合request_slowlog_timeout使用
slowlog = log/$pool.log.slow
站長資訊網