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