一、FastCGI是什麼?
首先咱們看下CGI,CGI全稱爲通用網關接口 Common Cateway Interface.用於HTTP服務上的程序服務通訊交流的一種工具,可讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的程序請求數據。CGI描述了服務器和請求處理程序之間傳輸數據的一種標準。 CGI程序必須運行在網絡服務器上。常見的如php-cgi.exe。是php支持CGI標準的執行檔。
CGI的工做原理:每當客戶請求CGI的時候,WEB服務器就請求操做系統生成一個新的解釋器進程(如php-cgi.exe),當CGI進程完成當前任務結束後,web服務器就會殺死這個進程。
可是CGI接口方式性能較差,因爲每次HTTP服務器遇到動態程序都須要重啓解析器來執行解析,拿php舉例,每個web請求,php都必須從新解析php.ini、從新載入所有dll擴展並從新初始化所有數據結構,你能夠想象這樣多慢。這在處理高併發的問題時,幾乎是不可能的。所以誕生了FastCGI.
因此,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail-Over特性等等。
FastCGI:是一個可伸縮、高速的在web server和腳步語言間通信的接口。其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。
二、FastCGI在web服務器(Nginx)中的工做原理。
(1)、web Sever 啓動時載入FastCGI進程管理器,如php的FastCGI進程管理器是PHP-FPM(php-FastCGI Process Manger).
(2)、FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(在任務管理器中可見多個php-cgi.exe)並等待來自web服務器的鏈接。啓動php-cgi FastCGI進程時,能夠配置以TCP協議或socker兩種方式啓動。
(3)、當客戶端請求到達Web Server時,Web Server將請求採用TCP協議或socket方式轉發到FastCGI主進程,FastCGI主進程選擇並鏈接到一個CGI解釋器(子進程php-cgi.exe)。Web Server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi.exe.
(4)、FastCGI子進程php-cgi.exe完成處理後將標準輸出和錯誤信息從原來的鏈接原路返回給web server。當FastCGI子進程關閉鏈接時,請求便處理完成。可是若是在傳統的CGI接口中,此時php-cgi子進程便在此退出了。
下圖所示的是Nginx+FastCGI的運做過程,腳本程序語言是php.
三、FastCGI的優勢
(1)、php腳本運行速度更快,php解釋程序被載入內存而不是每次須要時從存儲器讀取,極大提高了依靠腳本運行站點的性能。
(2)、須要使用的系統資源更少,因爲服務器不用每次在須要時都載入php解釋程序,你能夠將站點的傳輸速度提高不少而沒必要增長cpu負擔。
(3)、能夠把動態語言和HTTP服務器分離開來,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。多數流行的HTTP服務器都支持FastCGI包括Apache/Nginx/lighttpd等。
(4)、當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。php
用戶瀏覽器發起對網頁的訪問:http://192.168.1.103/index.php
用戶和nginx服務器進行三次握手進行TCP鏈接(還包括nginx訪問控制策略、nginx防火牆等訪問控制策略)
第一步:nginx接收到來自服務器的http請求。
第二步:nginx會根據用戶訪問的URL和後綴對請求進行判斷。
(1)、例如客戶端訪問的index.php,nginx則會根據配置文件中的location進行匹配。
例如:html
server { listen 8054; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
用戶訪問的是index.php,則會匹配到location ~.php$,這個的含義是對用戶經過url訪問的資源進行區分大小的匹配,而且訪問的資源是以.php結尾的。
這裏的 fastcgi_pass 127.0.0.1:9000,表示nginx經過fastcgi的接口將http請求發給127.0.0.1:9000進行處理,這個過程就是上面fastcgi運行原理中的第三部。這裏的php腳本解析服務和nginx放在同一個服務器上面。 這裏我用的是php返回動態的資源,因此這裏的FastCGI進程管理器用的是php-fpm。
(2)、fastcgi_pass將動態資源交給php-fpm後,php-fpm會講資源轉給php腳本解析服務器的wrapper.
(3)、wrapper收到php-fpm轉過來的請求後,wrapper會生成一個新的線程調用php動態程序處理腳本並讀取返回數據;好比讀取mysql數據庫,會觸發讀庫操做。
(4)、php會將查詢處理獲得的結果返回給wrapper,一直返回到nginx。最後Nginx將返回的數據發送給客戶端。
參考鏈接:
https://blog.csdn.net/m136663...
https://blog.csdn.net/riuhaze...
https://www.cnblogs.com/lidab...mysql