LNMP,CGI,FastCGl工作原理簡述
1.LNMP架構工作原理
-
用戶通過http協議發起請求,請求會先抵達LNMP架構中nginx
-
nginx會根據用戶的請求進行判斷,這個判斷是由Location完成的
-
判斷用戶請求的是靜態頁面,nginx直接進行處理
-
判斷用戶的請求是動態頁面,nginx會將該請求交給fastcgi協議下發
-
fastcgi會將請求交給php-fpm管理進程,php-fpm管理進程接收到後會調用具體的工作進程wrapper
-
wrapper線程會調用php進行解析,如果只是解析php代碼那公直接返回結果給客戶端
-
如果有查詢數據庫的操作,則由php連接數據庫(用戶密碼IP )然後發起查詢的操作
-
最終數據由mysqI -> php -> php-fpm -> fastcgi ->nginx -> http -> user
2.CGI介紹
-
CGI ( Common Gateway Interface),即通用網關接口,是WWW技術中最重要的技術之一, 是外部應用程序(即CGI程序)與WEB服務器之間的接口標準,負責在CGI程序和Web服務器之間傳遞信息
-
CGI是Web服務器運行時,調用外部應用程序(即CGI程序)的規範,CGI規範允許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器
出現背景
CGI是比較原始的開發動態網站的方式。由於靜態的html頁面無法實現網站的動態內容的生成,所以就需要由web務器調用CGI程序,CGI程序生成動態內容,返回給web服務器,web服務器再返回給瀏覽器。
功能:
CGI應用程序能通過Web服務器與瀏覽器進行交互,還可以通過數據庫API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據,將數據格式化爲HTML文檔後,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中
CGI程序處理步驟
- 瀏覽器通過HTML表單或超鏈接,請求指向一個CGI應用程序的URL
- 服務器收到瀏覽器發送的請求
- 服務器調用執行指定CGI應用程序;
- CGI應用程序根據相關信息(通常是基於瀏覽者輸入的內容)
- CGI應用程序把操作結果格式化爲網絡服務器和瀏覽器能夠理解的文檔(通常是HTML網頁) ,併發送給web服務器
- web服務器把操作結果返回給瀏覽器
3.FastCGI
FastCGI實際上是增加了一些擴展功能的CGI,是CGI的改進,描述了客戶端和Web服務器程序之間傳輸數據的一種標準。FastCGl致力於減少Web服務器與CGI程序之間進行互動的開銷,從而使Web服務器可以同時處理更多的Web請求。 與CGI爲每個Web請求創建一個新的進程不同,FastCGl 使用持續的進程來處理一連串的Web請求,這些進程由FastCGI進程管理器管理,而不是Web服務器
由於FastCGl程序並不需要不斷產生新進程,因此使用FastCGI可以大大降低Web服務器的壓力併產生較高的應用效率。
CGI就是所謂的短生存期應用程序,而FastCGI就是所謂的長生存期應用程序,FastCGI 像是一個常駐( long-live )型的CGI,FastCGl 可以一直執行着,而不會每次花費時間去fork (這也是CGI最爲人詬病的fork-and-execute模式)
FastCGI程序處理步驟
-
Web服務器啓動時,初始化FastCGI的程序執行環境。例如Nginx服務器對應的ngx_ http_ fastcgi_ module模塊
-
FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程並等待來自Web服務器的連接
-
當客戶端請求到達Web服務器時,Web服務器將該請求採用socket方式轉發到FastCGl主進程,FastCGI主進程選擇並連接到一個CGI解釋器(關聯FastCGI子進程),然後Web服務器將CGI環境變和標準輸入發送到FastCGI子進程。
-
FastCGI子進程完成處理後,將標準輸出和錯誤信息從同一socket連接返回給Web服務器。最後,FastCGI子進程關閉與Web服務器之間的連接。
-
FastCGl子進程繼續等待並處理下一個來自Web服務器的連接