Nginx緩存優化是幫助大家提升網站性能的重要操作之一,proxy_cache主要用於反向代理時,對后端內容源服務器進行緩存;fastcgi_cache主要用於對FastCGI的動態程序進行緩存。但是大多數同學存在對proxy_cache比較熟悉,對fastcgi_cache相對陌生的情況。但事實是Fastcgi參數的優化在很大程度上提高了整個應用系統的性能。今天小編幫助大家打破“陌生”,一起探索Ngnix中的Fastcgi參數性能優化~
什么是Fastcgi
FastCGI,全稱快速通用網關接口(FastCommonGatewayInterface),可以看作是常駐型的CGI,執行速度更快。由於服務器不能直接運行php、asp等文件,因此需要引入一個第三方程序,並和它有個約定:我把請求參數發送給你,然后我接收你的處理結果再給客戶端,這就是CGI。

Nginx的Fastcgi cache是用來緩存用戶請求,當用戶下次再進行同樣的訪問的時候直接將緩存結果返回給用戶,避免了Nginx再向上游請求結果的過程,使服務性能大幅度提升,如果服務是靜態可緩存的話使用這個模塊能夠明顯縮短用戶請求時間同時節省服務器資源,大大提升服務的QPS。

Fastcgi緩存的優缺點
通過緩存php、asp生成的動態內容,來減少了nginx與php、asp的通信次數,從而減輕php、asp和后段數據庫的壓力,響應時間由幾百毫秒降低到幾十毫秒。
雖然效果顯著,但是fastcgi_cache有個致命缺點,在緩存失效時間之內,即使更新了數據庫信息,訪問內容也不會發生變化。
Fastcgi緩存的適用場景
- 非即時數據查詢的應用
- 數據變化頻率低
- 輕量,非大型web站點
- 節省資源,代替Memcached服務器
Fastcgi優化配置詳解
就優化性能參數設置,下面會從兩個模塊分別說明:
1)http區域設置的緩存參數
fastcgi_temp_path path [level1 [level2 [level3]]];
fastcgi_cache_path path [levels=m:n] keys_zone=name:size [inactive=time] [max_size=size]
參數解釋:
# path 緩存文件存放(臨時)目錄 # levels 緩存層次 # keys_zone 緩存空間名和共享內存大小 # inactive 失效時間, 1d = 1天 # max_size 最大緩存空間(硬盤占用)
【推薦配置】
fastcgi_temp_path /tmp/temp fastcgi_cache_path /var/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:256m inactive=1d max_size=1g; #共享內存大小和最大緩存空間由具體應用重新評估設置
注: fastcgi_temp_path 和 fastcgi_cache_path 指定的路徑必須在同一分區
2)server模塊設置的緩存參數
fastcgi_connect_timeout=300; #fastcgi連接超時時間 fastcgi_send_timeout=300; #fastcgi請求超時時間 fastcgi_rend_timeout=300; #接收fastcgi應答超時時間 fastcgi_buffer_size=64k; #讀取fastcgi應答需要多大緩沖區 fastcgi_buffers 4 64k; #指定本地需要多少個和多大的緩沖區來緩沖fastcgi應答請求 fastcgi_busy_buffers_size 128k; #默認值是fastcgi_buffer的2倍 fastcgi_temp_file_write_size 128k; #寫入緩存文件使用多大的數據塊 fastcgi_cache #表示開啟FastCGI緩存並為其指定一個名稱。 fastcgi_cache_valid #指定緩存狀態及失效時間 fastcgi_cache_min_uses #指定緩存成為過期數據 fastcgi_cache_use_stale #定義哪些情況下用過期緩存 fastcgi_cache_key #指定緩存文件的標識,這個標識會 MD5 轉碼存儲在緩存域的目錄下 ffastcgi_cache_methods #指定緩存的請求方式
【推薦配置】
fastcgi_connect_timeout=300 fastcgi_send_timeout=300; fastcgi_rend_timeout=300; fastcgi_buffer_size=64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache fcgi; fastcgi_cache_valid 200 302 301 1h; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_cache_key "$request_method://$host$request_uri"; fastcgi_cache_methods GET HEAD;

其他問題
1、頁面訪問空白
原因:這是由於 fastcgi_cache_key 中沒有設置$request_method,將 GET 和 HEAD 的請求存儲到了同一個 key 中。
解決:配置完畢后,訪問偶爾出現空白頁面,清空緩存目錄后,重新訪問恢復。
2、頁面緩存失敗,一直 MISS
原因:默認情況下,請求的 header 中包含“Expires”, “Cache-Control”, “Set-Cookie”等,頁面將不會被緩存。
解決:添加參數 fastcgi_ignore_headers Cache-Control Expires SetCookie;重載nginx服務即可。