FastCGI是從CGI發(fā)展改進而來的,。傳統(tǒng)CGI接口方式的主要缺點是性能很差,因為每次HTTP服務器遇到動態(tài)程序時都需要重新啟動腳本解析器來執(zhí)行解析,,然后結果被返回給HTTP服務器,。這在處理高并發(fā)訪問時,幾乎是不可用的,。另外傳統(tǒng)的CGI接口方式安全性也很差,,現(xiàn)在已經(jīng)很少被使用了,。
FastCGI接口方式采用C/S結構,,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程,。當HTTP服務器每次遇到動態(tài)程序時,,可以將其直接交付給FastCGI進程來執(zhí)行,然后將得到的結果返回給瀏覽器,。這種方式可以讓HTTP服務器專一地處理靜態(tài)請求或者將動態(tài)腳本服務器的結果返回給客戶端,,這在很大程度上提高了整個應用系統(tǒng)的性能。
Nginx不支持對外部程序的直接調用或者解析,,所有的外部程序(包括PHP)必須通過FastCGI接口來調用,。FastCGI接口在Linux下是socket,(這個socket可以是文件socket,,也可以是ip socket),。為了調用CGI程序,,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,,如端口或者文件socket,。當Nginx將CGI請求發(fā)送給這個socket的時候,通過FastCGI接口,,wrapper接納到請求,,然后派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數(shù)據(jù),;接著,,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx,;最后,,Nginx將返回的數(shù)據(jù)發(fā)送給客戶端,這就是Nginx+FastCGI的整個運作過程,。詳細的過程,,如圖所示。
例子:
Nginx中FastCGI參數(shù)的優(yōu)化配置實例
在配置完成Nginx+FastCGI之后,,為了保證Nginx下PHP環(huán)境的高速穩(wěn)定運行,,需要添加一些FastCGI優(yōu)化指令。下面給出一個優(yōu)化實例,,將下面代碼添加到Nginx主配置文件中的HTTP層級,。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m;
上述代碼的含義:
第一行代碼是為FastCGI緩存指定一個文件路徑、目錄結構等級,、關鍵字區(qū)域存儲時間和非活動刪除時間,。
fastcgi_connect_timeout指定連接到后端FastCGI的超時時間。
fastcgi_send_timeout指定向FastCGI傳送請求的超時時間,,這個值是已經(jīng)完成兩次握手后向FastCGI傳送請求的超時時間,。
fastcgi_read_timeout指定接收FastCGI應答的超時時間,這個值是已經(jīng)完成兩次握手后接收FastCGI應答的超時時間,。
fastcgi_buffer_size用于指定讀取FastCGI應答第一部分需要用多大的緩沖區(qū),,這個值表示將使用1個64KB的緩沖區(qū)讀取應答的第一部分(應答頭),可以設置為fastcgi_buffers選項指定的緩沖區(qū)大小,。
fastcgi_buffers指定本地需要用多少和多大的緩沖區(qū)來緩沖FastCGI的應答請求,。如果一個PHP腳本所產(chǎn)生的頁面大小為256KB,那么會為其分配4個64KB的緩沖區(qū)來緩存,;如果頁面大小大于256KB,,那么大于256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,,因為內存中的數(shù)據(jù)處理速度要快于硬盤,。一般這個值應該為站點中PHP腳本所產(chǎn)生的頁面大小的中間值,,如果站點大部分腳本所產(chǎn)生的頁面大小為256KB,那么可以把這個值設置為“16
16k”,、“4 64k”等,。
fastcgi_busy_buffers_size的默認值是fastcgi_buffers的兩倍。
fastcgi_temp_file_write_size表示在寫入緩存文件時使用多大的數(shù)據(jù)塊,,默認值是fastcgi_buffers的兩倍,。
fastcgi_cache表示開啟FastCGI緩存并為其指定一個名稱。開啟緩存非常有用,,可以有效降低CPU的負載,,并且防止502錯誤的發(fā)生,但是開啟緩存也會引起很多問題,,要視具體情況而定,。
fastcgi_cache_valid、fastcgi用來指定應答代碼的緩存時間,,實例中的值表示將200和302應答緩存一個小時,,將301應答緩存1天,其他應答均緩存1分鐘,。