原文地址:http://book.51cto.com/art/201202/314840.htm
Nginx不支持對外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調(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請求發(fā)送給這個(gè)socket的時(shí)候,通過FastCGI接口,wrapper接收到請求,然后派生出一個(gè)新的線程,這個(gè)線程調(diào)用解釋器或者外部程序處理腳本并讀取返回?cái)?shù)據(jù);接著,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數(shù)據(jù)發(fā)送給客戶端。這就是Nginx+FastCGI的整個(gè)運(yùn)作過程,如圖1-3所示。
Nginx 的 buffer 機(jī)制
對于來自 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 的頁面,Nginx 會創(chuàng)建 24K 共 2 個(gè) buffers。
當(dāng) Response 小于等于 36k 時(shí),所有數(shù)據(jù)當(dāng)然全部在內(nèi)存中處理。如果 Response 大于 36k 呢?fastcgi_temp 的作用就在于此。多出來的數(shù)據(jù)會被臨時(shí)寫入到文件中,放在這個(gè)目錄下面。