Web 應用、服務是如何工作的?

基於學習的目的,想搭建一個網站,學習web開發。

採用apache+ mod_python/wsgi/cgi + Django + python + mysql

前端:html + css + js

前端還好了。

我的問題是:

apache實現了哪些功能,又有哪些功能是由mod_python/wsgi/cgi實現的,哪些交給Django處理?

Django做了什麼我大概有一些了解,只是apache 和 mod_python/wsgi/cgi 小弟確實不太清楚。我只知道apache是網路伺服器是基礎,mod_python/wsgi/cgi這三個是後台控制和apache之間的介面。但他們分別具體做了哪些呢?

我知道做後台開發這些知識並不是必須的,但是還是想知道個為什麼。科普級別就好,也不用太高深。提前感謝。


個人的一些理解啊,

有錯誤的地方歡迎指出。

apache處理的是最底下的兩層,網路通信層和協議層。

網路通信層:包括tcp網路通信的若干工作,比如bind, listen, connect, receive, send, disconnect。

協議層:apache可以處理http協議中的request和response,並且可以解釋header和body。

mod_python/wsgi/cgi是中間部分。

先說最簡單的cgi。

cgi是通過系統標準的進程調用的方式調用上層程序來完成邏輯部分的處理。cgi將apache整理好的request header和request body分別以env和stdin的方式發給上層程序,然後將上層程序的stdout返回給apache。

後來人們覺得,每一個請求都產生一個進程,這樣做效率太低。所以後來人們發明了fastcgi。它的原理大概的意思是說fastcgi啟動一個常駐進程。每次當apache接到request的時候,通過IPC或者socket將請求內容發給fastcgi進程,然後fastcgi再轉發給上層應用。

fastcgi支持C、PHP等多種語言。

後來又有人針對Python語言做了好多優化工作,產生了mod_python和wsgi。

Django上最上層的邏輯部分。

cgi =&> Django:

Python程序被以一個進程的方式被啟動。Django首先要讀取env和stdin,整理成request header和request body,從中找到URI欄位,然後根據url映射關係找到對應的函數開始執行。最後將函數的返回值以某種固定的格式輸出給stdout。

mod_python/wsgi =&> Django:

過了mod_python/wsgi之後,就全是Python程序了。request header、request body和response被mod_python/wsgi整理成了Python對象。例如字典、FileIO等。

Django拿到這些對象之後,就可以從request header中找到URI,然後根據url映射關係找到對應的函數開始執行。之後將函數的返回值整理成mod_python/wsgi可以接受的response對象(實際上就是一個str或者generator)返回給mod_python/wsgi。


推薦閱讀:

hadoop學習路線,希望各位幫幫忙?
php-cgi和php-fpm有什麼關係?
項目做到什麼程度才可以進入Apache Incubator(Apache孵化器)?
如何看待2016年4月26日晚,中國互聯網被Struts2漏洞血洗?
怎樣正確做 Web 應用的壓力測試?

TAG:Python | CGI | Django框架 | Apache | WSGI |