星期二, 十二月 26, 2006

Django 学习笔记 - Apache2 + FastCGI

昨天开始学习Django站点的生产服务器(Production Server),尝试了一下lighttpd和Apache2,最后决定采用Apache2来搭建整个环境(其实lighttpd更为方便一些)。

虽然Apache2 + mod_python就可以跑Django站点服务,但是听说FastCGI有更优异的性能。

FastCGI applications are fast because they're persistent. There is no per-request startup and initialization overhead. This makes possible the development of applications which would otherwise be impractical within the CGI paradigm (e.g. a huge Perl script, or an application which requires a connection to one or more databases).
需要让Apache2支持FastCGI,就必须下载mod_fastcgi这个Apache模块。可以从http://www.fastcgi.com/站点下载,不过非Windows用户需要自行编译这个模块,其实也挺方便的。下面是我在 Ubuntu 下安装的例子:

apt-get install apache2-dev # 会安装Apache2开发相关的库
cd $mod_fastcgi_dir
apxs2 -o mod_fastcgi.so -c *.c # 编译
sudo apxs2 -i -a -n fastcgi mod_fastcgi.so # 安装到Apache2/modules里面去,同时会到apache配置里面加上一条加载语句

mod_fastcgi.so就这样完成了,下面需要配置你的Django站点。首先去下载 flup,然后写一个mysite.fcgi,这个在Django的站点上有介绍,里面需要指定Django应用的绝对路径。
#!/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
这个文件搁在你的Django应用的根目录里面,改成可执行属性。然后你每次只需要执行这个文件就可以将Django以FastCGI方式启动出来了,启动后你是不能够直接访问的,因为不是走的Web方式。

下面我们看一下Apache相关的配置:
# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock

<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.*)$ /home/user/public_html/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</virtualhost>
$1处我遇到了一个奇怪的问题,因为用的是 Ubuntu,没在其他平台试过,/$1会指向硬盘的/media物理路径,很奇怪,所以需要修改这个路径为Django的站点目录,即将DocumentRoot的地址再写一遍。

这样一来,整个Apache2+FastCGI就完成了,的确比较费力气。

没有评论: