转:Django搭配FastCGI.

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_rewritemod_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

posted @ 2011-10-31 09:32  babykick  阅读(865)  评论(0编辑  收藏  举报