使用FastCGI部署Python的Django应用的教程
作为一个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已经一直驻留在内存里面了的,所以它响应起来也是很快的。
记录
在虚拟主机上使用的话,你可能会被强制的使用Webserver-managedFastCGI进程。在这样的情况下,请参阅下面的“在Apache共享主机里运行Django”这一小节。
web服务器有两种方式于FastCGI进程交互:使用Unixdomainsocket(在win32里面是命名管道)或者使用TCPsocket.具体使用哪一个,那就根据你的偏好而定了,但是TCPsocket弄不好的话往往会发生一些权限上的问题。Whatyouchooseisamannerofpreference;aTCPsocketisusuallyeasierduetopermissionsissues.
开始你的服务器项目,首先进入你的项目目录下(你的manage.py文件所在之处),然后使用manage.pyrunfcgi命令:
./manage.pyrunfcgi[options]
想了解如何使用runfcgi,输入manage.pyrunfcgihelp命令。
你可以指定socket或者同时指定host和port。当你要创建Web服务器时,你只需要将服务器指向当你在启动FastCGI服务器时确定的socket或者host/port。
范例:
在TCP端口上运行一个线程服务器:
./manage.pyrunfcgimethod=threadedhost=127.0.0.1port=3033
在Unixsocket上运行prefork服务器:
./manage.pyrunfcgimethod=preforksocket=/home/user/mysite.sockpidfile=django.pid
启动,但不作为后台进程(在调试时比较方便):
./manage.pyrunfcgidaemonize=falsesocket=/tmp/mysite.sock
停止FastCGI的行程
如果你的FastCGI是在前台运行的,那么只需按Ctrl+C就可以很方便的停止这个进程了。但如果是在后台运行的话,你就要使用Unix的kill命令来杀掉它。然而,当你正在处理后台进程时,你会需要将其付诸于Unixkill的命令
如果你在manage.pyrunfcgi中指定了pidfile这个选项,那么你可以这样来杀死这个FastCGI后台进程:
kill`cat$PIDFILE`
$PIDFILE就是你在pidfile指定的那个。
你可以使用下面这个脚本方便地重启Unix里的FastCGI守护进程:
#!/bin/bash #Replacethesethreesettings. 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.pyrunfcgisocket=$SOCKETpidfile=$PIDFIL