天天看點

Nginx中FastCGI緩存配置 詳解(主要針對PHP優化)

轉自:https://www.fujieace.com/php/fastcgi.html

一、什麼是 FastCGI?

FastCGI是一個可伸縮地、高速地在HTTP server和動态腳本語言間通信的接口。多數流行的HTTP server都支援FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支援,其中就有PHP。

FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能很差,因為每次HTTP伺服器遇到動态程式時都需要重新啟動腳本解析器來執行解析,然後結果被傳回給HTTP伺服器。這在處理高并發通路時,幾乎是不可用的。另外傳統的CGI接口方式安全性也很差,現在已經很少被使用了。

FastCGI接口方式采用C/S結構,可以将HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或者多個腳本解析守護程序。當HTTP伺服器每次遇到動态程式時,可以将其直接傳遞給FastCGI程序來執行,然後将得到的結果傳回給浏覽器。這種方式可以讓HTTP伺服器專一地處理靜态請求或者将動态腳本伺服器的結果傳回給用戶端,這在很大程度上提高了整個應用系統的性能。

二、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的整個運作過程。詳細的過程,如下圖所示:

Nginx中FastCGI緩存配置 詳解(主要針對PHP優化)
Nginx中FastCGI緩存配置 詳解(主要針對PHP優化)

三、Nginx中FastCGI緩存參數的優化配置執行個體

在配置完成Nginx+FastCGI之後,為了保證Nginx下PHP環境的高速穩定運作,需要添加一些FastCGI優化指令。下面給出一個優化執行個體,将下面代碼添加到Nginx主配置檔案中的http層級。

http{
......

    fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=licache:10m inactive=5m;
    fastcgi_cache_key "$request_method://$host$request_uri";
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 8 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_cache licache;
    fastcgi_cache_valid 200 302 1h;
    fastcgi_cache_valid 301 1d;
    fastcgi_cache_valid any 1m;
    fastcgi_cache_min_uses 1;
    fastcgi_cache_use_stale error timeout invalid_header http_500;

    open_file_cache max=65535 inactive=20s;
    open_file_cache_min_uses 1;
    open_file_cache_valid 30s;

......

}
           

如果你也是做程式設計的,上面代碼看一下也能明白各代表什麼意思?

下面簡單講一下上述代碼的含義,可能不全,具體請檢視nginx官方文檔:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

第一行代碼是為FastCGI緩存指定一個檔案路徑、目錄結構等級、關鍵字區域存儲時間和非活動删除時間。

fastcgi_connect_timeout指定連接配接到後端FastCGI的逾時時間。

fastcgi_send_timeout指定向FastCGI傳送請求的逾時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的逾時時間。

fastcgi_read_timeout指定接收FastCGI應答的逾時時間,這個值是已經完成兩次握手後接收FastCGI應答的逾時時間。

fastcgi_buffer_size用于指定讀取FastCGI應答第一部分需要用多大的緩沖區,這個值表示将使用1個64KB的緩沖區讀取應答的第一部分(應答頭),可以設定為fastcgi_buffers選項指定的緩沖區大小。

fastcgi_buffers指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求。如果一個PHP腳本所産生的頁面大小為256KB,那麼會為其配置設定4個64KB的緩沖區來緩存;如果頁面大小大于256KB,那麼大于256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因為記憶體中的資料處理速度要快于硬碟。一般這個值應該為站點中PHP腳本所産生的頁面大小的中間值,如果站點大部分腳本所産生的頁面大小為256KB,那麼可以把這個值設定為“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size的預設值是fastcgi_buffers的兩倍。

fastcgi_temp_file_write_size表示在寫入緩存檔案時使用多大的資料塊,預設值是fastcgi_buffers的兩倍。

fastcgi_cache表示開啟FastCGI緩存并為其指定一個名稱。開啟緩存非常有用,可以有效降低CPU的負載,并且防止502錯誤的發生,但是開啟緩存也會引起很多問題,要視具體情況而定。

fastcgi_cache_valid、fastcgi用來指定應答代碼的緩存時間,執行個體中的值表示将200和302應答緩存一個小時,将301應答緩存1天,其他應答均緩存1分鐘。

轉自:https://www.fujieace.com/php/fastcgi.html