原文地址:http://book.51cto.com/art/201202/314840.htm
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ò)程汁胆,如圖1-3所示。
Nginx 的 buffer 機(jī)制
對(duì)于來(lái)自 FastCGI Server 的 Response霜幼,Nginx 將其緩沖到內(nèi)存中嫩码,然后依次發(fā)送到客戶端瀏覽器。緩沖區(qū)的大小由 fastcgi_buffers 和 fastcgi_buffer_size 兩個(gè)值控制罪既。
比如如下配置:
fastcgi_buffers 8 4K;
fastcgi_buffer_size 4K;
fastcgi_buffers 控制 nginx 最多創(chuàng)建 8 個(gè)大小為 4K 的緩沖區(qū)铸题,而 fastcgi_buffer_size 則是處理 Response 時(shí)第一個(gè)緩沖區(qū)的大小,不包含在前者中琢感。所以總計(jì)能創(chuàng)建的最大內(nèi)存緩沖區(qū)大小是 84K+4K = 36k丢间。而這些緩沖區(qū)是根據(jù)實(shí)際的 Response 大小動(dòng)態(tài)生成的,并不是一次性創(chuàng)建的驹针。比如一個(gè) 8K 的頁(yè)面烘挫,Nginx 會(huì)創(chuàng)建 24K 共 2 個(gè) buffers。
當(dāng) Response 小于等于 36k 時(shí)柬甥,所有數(shù)據(jù)當(dāng)然全部在內(nèi)存中處理饮六。如果 Response 大于 36k 呢其垄?fastcgi_temp 的作用就在于此。多出來(lái)的數(shù)據(jù)會(huì)被臨時(shí)寫(xiě)入到文件中卤橄,放在這個(gè)目錄下面绿满。