基本介紹 1)WEB服務僅能處理靜態請求,如果處理動態請求則需要對應的動態資源服務軟體,即:應用程式服務軟體 2)常見的應用服務軟體有:PHP、Java、Python等 3)問題:WEB服務如何與外部應用程式通信?通常有以下幾種方案: - CGI協議:基本沒人使用,不安全以及性能極其低下 - 模塊方 ...
基本介紹
1)WEB服務僅能處理靜態請求,如果處理動態請求則需要對應的動態資源服務軟體,即:應用程式服務軟體
2)常見的應用服務軟體有:PHP、Java、Python等
3)問題:WEB服務如何與外部應用程式通信?通常有以下幾種方案:
- CGI協議:基本沒人使用,不安全以及性能極其低下
- 模塊方式:如:Apache內置PHP模塊,用以處理PHP動態請求
- FastCGI協議:如:NGINX的php-fpm
4)CGI、內置模塊、FastCGI這三種方式,性能最好的要屬FastCGI,但是需要額外的進程
5)註意:靜態資源和動態資源都是以數據流(本質都是數據流)形式返回用戶的:
- 靜態資源:WEB服務將頁面文件以【數據流】形式封裝到響應報文,然後返回用戶
- 動態資源:WEB服務將執行結果(註意:此時是結果非文件)以【數據流】形式封裝到響應報文,然後返回用戶
CGI協議介紹
1)CGI(Common Gateway Interface):通用網關介面,早期WEB服務與外部應用程式(CGI程式)通信的協議/介面標準,幾乎可以在任何操作系統上實現(跨平臺性好)
2)CGI協議允許WEB服務執行外部程式,並將外部應用程式執行的結果返回WEB服務,並最終返回用戶
3)工作原理:用戶請求WEB資源,靜態請求交由WEB服務自行處理;如果是動態請求,WEB服務會【fork()】一個子進程(CGI進程/應用程式服務進程),然後將動態請求交由子進程處理,處理完後的數據返回WEB服務,最終由WEB服務封裝為HTTP響應報文返回用戶,然後結束這個子進程
4)每一次的動態請求都會【fork()】一個子進程,周而複始的進行。所以,通過CGI協議處理動態請求,有多少連接請求就會創建多少CGI子進程,子進程反覆載入是CGI方式性能低下的主要原因,當用戶請求數量非常多時,會大量擠占系統的資源如記憶體、CPU時間等,造成效能低下
WEB內置模塊介紹
1)後來出現了一種更高級的方式,即:WEB服務可以內置Perl解釋器或PHP解釋器,也就是將這些解釋器做成模塊的方式,WEB服務會在啟動時就會載入這些模塊
2)工作原理:用戶請求WEB資源,靜態請求交由WEB服務處理;如果是動態請求,WEB服務會通過內置模塊來進行響應、解析、處理,省得重新fork一個進程,效率提高了。動靜請求都是由WEB服務自身處理的
FastCGI協議介紹
1)WEB服務、應用程式均為守護進程,二者基於FastCGI協議通過套接字通信
2)FastCGI協議採用的是C/S架構,分為客戶端(WEB服務)和服務端(應用程式服務)
3)大多數WEB服務都支持FastCGI協議,包括Apache、Nginx、LigHTTPd等。同時,FastCGI協議也被許多應用程式服務所支持,如:當前比較流行的動態語言PHP
3)工作原理:用戶請求WEB資源,靜態請求交由WEB服務處理;如果是動態請求,WEB服務會通過【FastCGI協議】將請求發給應用程式服務進行處理,應用程式會將處理完的結果返回WEB服務,最終由WEB服務封裝為HTTP響應報文返回用戶。此時,WEB服務和應用程式服務均為守護進程(可以啟動多個FastCGI的守護進程)
4)與CGI協議的區別:
相關鏈接
1)https://www.zhihu.com/question/30672017
2)https://blog.csdn.net/linuxheik/article/details/51865292
3)https://www.awaimai.com/371.html
4)https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
5)http://www.ttlsa.com/web/fastcgi-cgi-diff/