2007年9月23日

有备无患:在支持FastCGI的Lighttpd服务器上部署Django的笔记

Django是一个鼓励快速开发和简练设计的基于Python的高级网络框架。这篇文章详细记录了我在本地部署Django的过程,服务器是支持FastCGI的Lighttpd,操作系统是Gentoo Linux。条条大路通罗马,网上也有很多Django的教程,但这可能是更适合Django本地学习和更有效率的一条捷径。欢迎FIX-ME

开读之前,请注意一下时效性:Django版本:0.96,Lighttpd版本:1.4.18,日期:2007年9月。

一、安装Lighttpd


无论什么时候,在Gentoo上安装软件都是一件愉快的事情,因为我们可以通过USE flags来选择需要安装的包。如果你和我一样记不住这些USE flags的具体意义,不妨用euse查看一下,例如:


# euse -i fastcgi

Lighttpd包括下列USE flags:

  • bzip2 - 为mod_compress提供bzip2支持
  • fastcgi - 提供FastCGI支持,使用Django或PHP都需要FastCGI来提升性能
  • gdbm -提供GNU数据库支持
  • ipv6 - 提供IPv6支持
  • lua - 为mod_cml提供Lua支持
  • memcache - 为for mod_cml提供内存缓存支持
  • mysql - 为mod_mysql_vhost提供MySQL的设定支持
  • pcre - 为Lighttpd配置文件中正则表达式提供PCRE支持
  • php - 提供mod_fastcgi/php的设定支持
  • rrdtool - 为一些统计图形提供RRDtool支持
  • ssl - 为HTTPS提供OpenSSL支持
  • doc -提供安装文档支持
  • fam - 为减少stat()的响应数,提供fam/gamin支持
  • ldap - 提供LDAP支持
  • minimal - 最小化安装,不包括安装文档和不使用的模块
  • webdav - 提供WebDAV支持
  • xattr -提供额外的属性支持

和Apache有内嵌的Python解释器(mod_python)不同,Lighttpd只能通过CGI或者FastCGI方式执行Python脚本。CGI的先天不足导致它在大型Web应用上效率不佳。FastCGI在设计上继承了CGI不受操作系统、服务器和开发语言的限制,又利用一个类似常驻型CGI的设计大幅提高了执行效率。所以,我们在安装Lighttpd的时候,需要把fastcgi选入USE flags。至于其他选项,大家就各取所需了。


# echo "www-servers/lighttpd fastcgi ssl fam" >> /etc/portage/package.use
# emerge -av lighttpd

二、安装Django


接下来安装Django。本地安装Django很轻松,直接emerge就可以了:


# echo "dev-python/django examples sqlite" >> /etc/portage/package.use
# emerge -av django

emerge完以后,我们试试Django是否安装正确。运行Python,输入:


>>> from django.core.handlers.wsgi import WSGIHandler

也可以把其他Django的组件导入Python。如果没有出错信息,表示Django安装完成了。

三、安装flup


flup是一个基于Python的架设FastCGI服务器的模块,这也是需要安装的。


# emerge -av flup

然后,我们试试flup是否安装正确。运行python,输入:


>>> from flup.server.fcgi_fork import WSGIServer

如果没有出错信息,表示flup安装完成。

四、配置Lighttpd和FastCGI


Lighttpd自带的配置相当完整,只需要稍作修改就可以让Lighttpd支持FastCGI。
首先修改lighttpd.conf,自定义Lighttpd的主目录和日志目录等。


# {{{ variables
var.basedir = "/var/www/localhost"
var.logdir = "/var/log/lighttpd"
var.statedir = "/var/lib/lighttpd"
# }}}

你可以把所有的配置都塞到lighttpd.conf中,但是,Lighttpd默认你把CGI和FastCGI的配置文件分别放到了mod_cgi.conf和mod_fastcgi.conf文件中,并在lighttpd.conf中include它们。这样的结构更加简洁明白,本文也采用这种方法配置Lighttpd。


# {{{ includes
include "mime-types.conf"
include "mod_cgi.conf"
include "mod_fastcgi.conf"
# }}}

为2.6核心版本的Linux优化性能。


# for >= linux-2.6
server.event-handler = "linux-sysepoll"

指定用mod_fastcgi处理.py文件。


static-file.exclude-extensions = (".php", ".pl", ".py", ".cgi", ".fcgi")

在lighttpd.conf中,我们还可以设定一些其他参数,比如server.max-worker、server.max-keep-alive-requests、server.max-keep-alive-idle等,来优化Lighttpd的性能,让Lighttpd在大型的Web应用中表现更好。

接下来,修改mod_cgi.conf。


server.modules += ("mod_cgi")

alias.url = (
"/cgi-bin/" => var.basedir + "/cgi-bin/"
)

$HTTP["url"] =~ "^/cgi-bin/" {
    # disable directory listings
    dir-listing.activate = "disable"
    # only allow cgi's in this directory
    cgi.assign = (
        ".pl" => "/usr/bin/perl",
        ".py" => "/usr/bin/python",
        ".cgi" => "/usr/bin/perl"
    )
}

修改mod_fastcgi.conf。



server.modules += ("mod_fastcgi")
fastcgi.server = (
    "/main.fcgi" => (
        "main" => (
            "socket" => var.basedir + "/htdocs/tmp/django.socket",
        )
    ),
)

最后,我们重新启动Lighttpd,并把lighttpd加入启动项。


# /etc/init.d/lighttpd restart
# rc-update add lighttpd default

这样子就万事OK了,我们已经成功的把Django部署在支持FastCGI的Lighttpd服务器上了。接下去就可以开始设计自己的Django项目了。

标签: , , ,

2 条评论:

Blogger zoomq 说...

是也乎!赞个先,一个优秀作品的推广就是靠这种实作经验的积累和分享!

2007-9-23 22:38:00
Blogger wyt 说...

超同意~谢谢大妈鼓励啊~

2007-9-25 14:58:00

发表评论

指向此文章的链接:

创建链接

<< 主页