FastCGI執行原理及php-fpm引數配置
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
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-10/155058.htm