作為一個mod_python模組的替代,你可以考慮使用mod_wsgi模組,此模組開發的時間比mod_python的開發時間離現在更近一些,在Django社區已有一些使用。 一個完整的概述超出了本書的範圍,你可以從官方的Django文檔查看到更多的資訊。
使用FastCGI部署Django應用
儘管將使用Apache和mod_python搭建Django環境是最具魯棒性的,但在很多虛擬機器主機平台上,往往只能使用FastCGI
此外,在很多情況下,FastCGI能夠提供比mod_python更為優越的安全性和效能。 針對小型網站,相對於Apache來說FastCGI更為輕量級。
FastCGI 簡介
如何能夠由一個外部的應用程式很有效解釋WEB 伺服器上的動態網頁面請求呢? 答案就是使用FastCGI! 它的工作步驟簡單的描述起來是這樣的:
和mod_python一樣,FastCGI也是駐留在記憶體裡為客戶請求返回動態資訊,而且也免掉了像傳統的CGI一樣啟動進程時候的時間花銷。 但於mod_python不同之處是它並不是作為模組運行在web伺服器同一進程內的,而是有自己的獨立進程。
為什麼要在一個獨立的進程中運行代碼?
在以傳統的方式的幾種以mod_*方式嵌入到Apache的指令碼語言中(常見的例如: PHP,Python/mod_python和Perl/mod_perl),他們都是以apache擴充模組的方式將自身嵌入到Apache進程中的。
每一個Apache進程都是一個Apache引擎的副本,它完全包括了所有Apache所具有的一切功能特性(哪怕是對Django毫無好處的東西也一併載入進來)。 而FastCGI就不一樣了,它僅僅把Python和Django等必備的東東弄到記憶體中。
依據FastCGI自身的特點可以看到,FastCGI進程可以與Web伺服器的進程分別運行在不同的使用者權限下。 對於一個多人共用的系統來說,這個特性對於安全性是非常有好處的,因為你可以安全的於別人分享和重用代碼了。
如果你希望你的Django以FastCGI的方式運行,那麼你還必須安裝 flup 這個Python庫,這個庫就是用於處理FastCGI的。 很多使用者都抱怨 flup 的發布版太久了,老是不更新。 其實不是的,他們一直在努力的工作著,這是沒有放出來而已。
運行你的 FastCGI 伺服器
FastCGI是以客戶機/伺服器方式啟動並執行,並且在很多情況下,你得自己去啟動FastCGI的服務進程。 Web伺服器(例如Apache,lighttpd等等)僅僅在有動態網頁面訪問請求的時候才會去與你的Django-FastCGI進程互動。 因為Fast-CGI已經一直駐留在記憶體裡面了的,所以它響應起來也是很快的。
記錄
在虛擬機器主機上使用的話,你可能會被強制的使用Web server-managed FastCGI進程。 在這樣的情況下,請參閱下面的“在Apache共用主機裡運行Django”這一小節。
web伺服器有兩種方式於FastCGI進程互動: 使用Unix domain socket(在win32裡面是 具名管道 )或者使用TCP socket.具體使用哪一個,那就根據你的偏好而定了,但是TCP socket弄不好的話往往會發生一些許可權上的問題。 What you choose is a manner of preference; a TCP socket is usually easier due to permissions issues.
開始你的伺服器項目,首先進入你的項目目錄下(你的 manage.py 檔案所在之處),然後使用 manage.py runfcgi 命令:
./manage.py runfcgi [options]
想瞭解如何使用 runfcgi ,輸入 manage.py runfcgi help 命令。
你可以指定 socket 或者同時指定 host 和 port 。當你要建立Web伺服器時,你只需要將伺服器指向當你在啟動FastCGI伺服器時確定的socket或者host/port。
範例:
在TCP連接埠上運行一個線程伺服器:
./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
在Unix socket上運行prefork伺服器:
./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
啟動,但不作為後台進程(在調試時比較方便):
./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock
停止FastCGI的行程
如果你的FastCGI是在前台啟動並執行,那麼只需按Ctrl+C就可以很方便的停止這個進程了。 但如果是在後台啟動並執行話,你就要使用Unix的 kill 命令來殺掉它。 然而,當你正在處理後台進程時,你會需要將其付諸於Unix kill的命令
如果你在 manage.py runfcgi 中指定了 pidfile 這個選項,那麼你可以這樣來殺死這個FastCGI後台進程:
kill `cat $PIDFILE`
$PIDFILE 就是你在 pidfile 指定的那個。
你可以使用下面這個指令碼方便地重啟Unix裡的FastCGI守護進程:
#!/bin/bash# Replace these three settings.PROJDIR="/home/user/myproject"PIDFILE="$PROJDIR/mysite.pid"SOCKET="$PROJDIR/mysite.sock"cd $PROJDIRif [ -f $PIDFILE ]; then kill `cat -- $PIDFILE` rm -f -- $PIDFILEfi
exec /usr/bin/env - PYTHONPATH="../python:.." ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFIL