Django搭配FastCGI.
2011-07-17 01:57:41| 分類: 預設分類 | 標籤: |字型大小大中小 訂閱
翻譯:merlinHow to use Django with FastCGI
儘管現在評比的運行Django的措施是利用Apache加上flup,這是處理FastCGI的一個python庫。請確保利用最新的SVN版本:-) 啟用你的FastCGI伺服器
FastCGI 以client-server的形式舉行工作,大局部情形下,你自行啟用FastCGI曆程。你的web伺服器(能夠是apache,lighttpd, 可能別的什麼)僅僅在必需載入動態版面的時候才去聯絡你的Django-FastCGI曆程。因為它曾經在記憶體中待命,因而處理響應的速度是極其快的。
當心
萬一你玩的是分享主機系統,你可能***使以web伺服器管教的措施利用FastCGI曆程。往下看,如何處理這種情形。
Web伺服器有兩種和你的FastCGI伺服器發生聯絡的措施:要麼穿越Unix域通訊端(windows上則是具名管道),要麼直接穿越TCP通訊端。哪一種更好無所謂,取決於個人口味;只不過出於許可權琢磨,TCP通訊端措施更為容易一些。
啟用你的伺服器之前,先到你的project目錄下(也即便manage.py檔案所在的那個目錄啦),運行:
./manage.py runfcgi [options]
當然你能夠用help選項來看看協助訊息。 當然,你必需指定一個socket可能主機加連接埠,這能力開搞。然後設定web伺服器以告終啟用FastCGI伺服器。舉例如下:
在指定的TCP連接埠上運行一個threaded伺服器:
./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
在指定的Unix域通訊端上運行preforked伺服器:
./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
以非daemon措施運行一個曆程(便於調試):
./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock終止FastCGI daemon:
萬一是放在前台運行,顯明很容易:直接Ctrl-C之;萬一是後台,也很顯明:kill之。
萬一啟用的時候指定了pidfile選項,則能夠這麼kill之:
kill `cat $PIDFILE`
下面的shell指令碼能夠很得體地重起FastCGI:
#!/bin/bash
# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec /usr/bin/env - /
PYTHONPATH="../python:.." /
./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
Apache的搭配
當然,我們確定必需搭配了mod_fastcgi的apache。在此不再贅述,參見apache的有關文檔。
穿越編輯httpd.conf檔案來讓apache指向Django的FastCGI執行個體,你必需做如下兩件事情:
利用FastCGIExternalServer directive來指明FastCGI server的位置 利用mod_rewrite來貼切指明FastCGI上的URLs
關於指明FastCGI server的位置:
FastCGIExternalServer directive告訴 Apache 如何去找到你的FastCGI server。這裡 FastCGIExternalServer docs 解釋了,你能夠抉擇指定一個通訊端可能主機。這裡是一些例子:
# 穿越socket / named pipe來串連Connect to FastCGI
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
# 穿越TCP host/port來串連FastCGI
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
無論哪種情形,/home/user/public_html/mysite.fcgi 這個檔案無須存在。 這隻不過是web伺服器內部利用的一個URL而已—— 用來指明FastCGI定然處理哪一個URL的一個鉤子(下面細談)。 用 mod_rewrite 指明FastCGI上的URLs
第二步是讓apache懂得對於特定的形式相稱的URLs該交給FastCGI。為此,利用 mod_rewrite模組並且重寫 URLs 到 mysite.fcgi (可能任何你在FastCGIExternalServer directive中指明的東西,正如上面一節解釋的那樣)。
下面的例子中,我們告訴apache,對於所有非檔案存取並且不以/media/打頭的哀求,就讓FastCGI去處理。萬一我們在Django中利用admin這個feature的話,這可能是最等閑的情形:
<VirtualHost 12.34.56.78>
ServerName example.com
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
RewriteRule ^/(media.*)$ /$1 [QSA,h.himuno.comL]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>
lighttpd 搭配
lighttpd是一個輕量級的web伺服器,等閑用來存取靜態檔案。它天生扶持FastCGI,因而,萬一你對apache未曾尤其要求的話,這是個很好的抉擇,不管是靜態版面還是動態版面。
確保 mod_fastcgi 曾經安裝,在 mod_rewrite和 mod_access爾後的某個地方,然而不要在 mod_accesslog爾後。你可能還必需 mod_alias,以便扶持 admin media。
在你的lighttpd 搭配檔案中加入下面這些:
server.document-root = "/home/user/public_html"
fastcgi.server = (
"/mysite.fcgi" => (
"main" => (
# Use host / port instead of socket for TCP fastcgi
# "host" => "127.0.0.1",
# "port" => 3033,
"socket" => "/home/user/mysite.sock",
"check-local" => "disable",
)
),
)
alias.url = (
"/media/" => "/home/user/django/contrib/admin/media/",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon/.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/mysite.fcgi$1",
)
在一個lighttpd中運行多個Django網站:
lighttpd用 "conditional configuration" 來扶持主機級的定製搭配。為了搭配多個FastCGI網站,只需在FastCGI搭配檔案中為每個網站加上下面的conditional block :
# If the hostname is 'om'... $HTTP["host"] == "om" { server.document-root = "/foo/site1" fastcgi.server = ( ... ) ... } # If the hostname is 'om'... $HTTP["host"] == "om" { server.document-root = "/foo/site2" fastcgi.server = ( ... ) ... }
你也能夠穿越在fastcgi.server directive中指定多個entry來扶持統一個網站上的多個Django 安裝,還有為每個Django加上一個FAstCGI主機。 在Apache的分享主機中運行Django :
等閑理況下,分享主機業主不批准你運行自己的伺服器曆程,也不批准你編輯httpd.conf搭配檔案。這時,對於Web server-spawned processes依舊能夠運行Django。
當心事項
萬一你遭到的是 Web server-spawned processes的情形,並無須要自己去啟用FastCGI伺服器。Apache 會依據情形衍生出一堆曆程以中意必需。
在你的Web根目錄下,加一個檔案: .htaccess
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
然後,創立一個小指令碼告訴Apache如何spawn你的FastCGI過程。創立一個 mysite.fcgi 檔案並且放到你的web目錄下,確保其有厲行許可權。
#!/usr/bin/python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/home/user/python")
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
重起spawned server
萬一你改換了任何python代碼,你就必需告訴FastCGI曾經動了代碼。然而未曾必需重起apache。相反,你只需上傳 mysite.fcgi檔案,可能編輯它一下,讓這個檔案的工夫戳變一下。這麼當apache看到這個檔案更新過了,他會積極去重起你的Django程 序。
萬一你有許可權在Unix系統上玩到shell,用下面這條容易的touch號召就能夠做到:
touch mysite.fcgi