apache django 間交互的問題?

當apache收到請求時,是重新運行一次Django腳本,還是跟一個已在運行的Djange通信?


這取決於你用哪種方式運行django。

題目限定在 apache django 間交互,所以 django 獨立運行的情況(./manage.py runserver)本文不討論。

現在主流的方式是wsgi(uwsgi,ruwsgi與此類似)。

官方文檔: How to deploy with WSGI

這種執行模式下,wsgi是一個獨立(或半獨立)的進程,與 apache 之前使用 TCP 進行通信(使用一個類似於 fastcgi 的協議)。

wsgi 將 http 報文轉成多個 Python 對象,比如 headers 轉成一個 dict ,body 轉成一個 file-like object。

django 拿到這些對象之後,再把它們轉成 request 對象。

然後經過 view 等處理完以後,再轉成多個 Python 對象交給 wsgi 。

wsgi 通過 TCP 將 response 報文發給 apache ,apache 再返回給瀏覽器。

10年前有一種古老的運行方式,叫 cgi 。這種方式效率很低,而且 django 不支持這種運行方式。

大概的過程是,每次 apache 收到一個 http 請求的時候,啟動一個新的進程,將 headers 設成環境變數,body 通過 stdin 傳給進程。進程通過 stdout 將 reponse 報文發給 apache ,然後進程退出。

這種運行方式的優勢在於,幾乎所有的編程語言都支持 環境變數、stdin、stdout 這3個東西,所以它可以不限制 cgi 程序使用的語言。比如 C 語言中,環境變數是 getenv, stdin 是 scanf, stdout 是 printf 。

但是它的劣勢也很明顯,每次 http 請求都要開啟一個新的進程,開銷非常大,所以性能非常低。現在已經(幾乎)沒有人在正式環境中使用這種方式了。


Django是一個Web框架,沒有運行的概念。通常我們說的啟動Django,指的是官方提供的一個用於開發和測試的建議伺服器,基於wsgi,它不能用於生成環境!

實際線上部署的時候,我們是使用apache一類的Web伺服器接收用戶請求,然後轉發給uwsgi通信介面,這個uwsgi可以調取Django的文件和資源,動態生成頁面,並返回給apche,最後到用戶瀏覽器。

所以,如果你看操作系統後台,只有apache進程和uwsgi進程,而沒有Django進程!

那麼為什麼一般用uwsgi呢?因為Django官方原生支持它!

最後,友情推薦《劉江的博客和教程》python。站主致力於分享Python和Django相關的博客和教程,內容全面,深入淺出,探索式講解,更符合國人口味,值得一看!


推薦閱讀:

關於阿里巴巴的矢量圖標與傳統的雪碧圖有什麼優勢?
Meterial Design 按鈕陰影疑惑?
誰能介紹下web前端工程化?
前端開發中提到的「腳手架」到底指什麼,CLI?gulp 和 gulp-cli有什麼區別
web前端之路?

TAG:前端開發 | Python | Django框架 | Apache |