nginx之fastcgi配置參數及其緩存


CGI的由來

最早的Web服務器只能簡單地響應瀏覽器發來的HTTP請求,並將存儲在服務器上的HTML文件返回給瀏覽器,也就是靜態html文件,但是后期隨着網站功能增多網站開發也越來越復雜,以至於出現動態技術,比如像php(1995年)、java(1995)、python(1991)語言開發的網站,但是nginx/apache服務器並不能直接運行 php、java這樣的文件,apache實現的方式是打補丁,但是nginx缺通過與第三方基於協議實現,即通過某種特定協議將客戶端請求轉發給第三方服務處理,第三方服務器會新建新的進程處理用戶的請求,處理完成后返回數據給Nginx並回收進程,最后nginx在返回給客戶端,那這個約定就是通用網關接口(common gateway interface,簡稱CGI),CGI(協議)是web服務器和外部應用程序之間的接口標准,是cgi程序和web服務器之間傳遞信息的標准化接口。 

cgi工作過程: 1、當用戶發來動態請求后,Nginx把請求通過cgi協議發送給后端的php服務器; 2、php服務器會開啟一個進程接收Nginx發來的請求; 3、php服務器會使用php解析器把用戶請求的php文件解析成html格式,然后返還給php的主進程,主進程再把數據返還給Nginx; 4、php回復完請求后會回收創建的進程; 5、Nginx把資源返還給客戶端; 注:這樣php會頻繁的創建和回收進程;1000個用戶訪問的話,會創建1000個進程。 

為什么會有FastCGI?

CGI協議雖然解決了語言解析器和seb server之間通訊的問題,但是它的效率很低,因為web server每收到一個請求都會創建一個CGI進程,每創建一個進程,PHP解析器都會解析php.ini(根據php.ini文件創建進程)文件,初始化環境,請求結束的時候再關閉進程,對於每一個創建的CGI進程都會執行這些操作,所以效率很低,而FastCGI是用來提高CGI性能的,FastCGI每次處理完請求之后不會關閉掉進程,而是保留這個進程,使這個進程可以處理多個請求。這樣的話每個請求都不用再重新創建一個進程了,大大提升了處理效率。 

fastcgi工作過程: 1、當用戶請求php后綴的資源時,Nginx把請求通過fastcgi協議發送給后端的php服務器; 2、php服務器有一個主進程和多個worker進程,主進程會把發送過來的請求交給一個worker進程進行處理,worker進程是預先生成好的; 3、worker使用php解析器把用戶請求的php文件解析成html格式,然后返還給php的主進程,主進程再把數據返還給Nginx; 4、php回復完請求后不會回收worker進程; 5、Nginx把資源返還給客戶端; 注:這樣php就不會頻繁的創建和回收進程,節省了時間。 

什么是PHP-FPM?

PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個實現了Fastcgi的程序,並且提供進程管理的功能。進程包括master進程和worker進程。master進程只有一個,負責監聽端口,接受來自webserver的請求。worker進程一般會有多個,每個進程中會嵌入一個PHP解析器,進行PHP代碼的處理。 

FastCGI配置參數

Nginx基於模塊ngx_http_fastcgi_module實現通過fastcgi協議將指定的客戶端請求轉發至php-fpm處理。 fastcgi_pass address; #轉發請求到后端服務器,address為后端的fastcgi server的地址,可用位置:location, if in location。 fastcgi_index name; #fastcgi默認的主頁資源,示例:fastcgi_index index.php;這個功能和index index.html功能一樣。 fastcgi_param parameter value [if_not_empty]; #設置傳遞給FastCGI服務器的參數值,可以是文本,變量或組合,可用於將Nginx的內置變量賦值給自定義key fastcgi_param REMOTE_ADDR $remote_addr; #客戶端源IP fastcgi_param REMOTE_PORT $remote_port; #客戶端源端口 fastcgi_param SERVER_ADDR $server_addr; #請求的服務器IP地址 fastcgi_param SERVER_PORT $server_port; #請求的服務器端口 fastcgi_param SERVER_NAME $server_name; #請求的server name 設置的這些key是不會變的,nginx的內置變量的值會變化;nginx會把設置好的key傳遞給php服務器,php會讀取這些參數里面的值。這個設置必須開啟,否則php讀取不了客戶端的請求。 

定義緩存及緩存調用

定義緩存

fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; #定義fastcgi的緩存,設置在http模塊中。 path   #緩存位置為磁盤上的文件系統路徑 max_size=size #磁盤path路徑中用於緩存數據的緩存空間上限 levels=levels:緩存目錄的層級數量,以及每一級的目錄數量,levels=ONE:TWO:THREE,示例:leves=1:2:2 keys_zone=name:size #設置緩存名稱及k/v映射的內存空間的名稱及大小 inactive=time #緩存有效時間,默認10分鍾,需要在指定時間滿足fastcgi_cache_min_uses次數被視為活動緩存。 

調用緩存

fastcgi_cache zone|off; #調用指定的緩存空間來緩存數據,可用位置:http, server, location;zone的值為keys_zone定義好的緩存名稱。 fastcgi_cache_key string; #定義用作緩存項的key的字符串,示例:fastcgi_cache_key $request_uri; 針對用戶請求的uri進行緩存。 fastcgi_cache_methods GET|HEAD|POST...; #為哪些請求方法使用緩存。 fastcgi_cache_min_uses number; #緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可被認作活動項,如果不夠命中所指定的緩存次數為非活動項,會將被從緩存中清除。 fastcgi_keep_conn on|off;   #收到后端服務器響應后,fastcgi服務器是否關閉連接,建議啟用長連接。這個功能需要開啟,php處理完這次請求后,如果和nginx斷開鏈接,下次用戶再次發起請求,nginx還需要和php先三次握手建立連接;開啟之后,nginx和php不斷開連接,省略了建立連接的過程。 fastcgi_cache_valid 200 10m; #不同的響應碼各自的緩存時長;200的緩存時長需要長一些,404的緩存時長短一些。 fastcgi_hide_header field; #隱藏后端php服務器的響應頭指定信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM