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前端之路?