Saturday, 4 March 2006

Setup Apache 2 + SCGI for Pylons(Paste Enabled) Web Application

我的Pylons试验平台是coLinux(Debian-3.0r2)。对于coLinux来讲,本机访问Pylons应用,没有问题,但从外部访问速度较慢,而访问Apache 2的速度却正常,原因未明。因此,通过Apache来访问Pylons应用,似乎是理想的解决办法。刚好xlp223也说到这事,就试试如何用Apache 2和SCGI来访问Pylons应用。

首先,需要为Pylons安装SCGI服务器,

$ sudo easy_install flup

接着,修改Pylons应用的配置文件scgi.ini,(缺省是development.ini,复制成scgi.ini)

...
[server:main]
use = egg:PasteScript#flup_scgi_thread
host = 127.0.0.1
port = 5001
...

请注意,egg:PasteScript#flup_scgi_thread,#号后面实际上不是注解,它是通知Paste用flup以多线程的方式提供SCGI Service。具体请看Paste的文档。这里,SCGI的端口是5001,只能本机访问。

使用如下命令启动或终止SCGI服务,

$ paster serve scgi.ini start (启动)
$ paster serve scgi.ini stop (终止)
$ paster serve scgi.ini status (状态检查)

也可以让SCGI以daemon模式运行,

$ paster serve --daemon scgi.ini
$ paster serve --stop-daemon scgi.ini

如果希望在开机的时候启动SCGI Service的话,请参考Paste的文档或其它Service,编写Service启动脚本。这里不再详述。

现在,Pylons应用已经可以运行在SCGI模式下了。但直接访问SCGI端口是没有结果的,还需要通过Apache来桥接过去。我使用的是Apache 2。如果要桥接SCGI服务,就必须安装mod_scgi模快。

$ sudo apt-get install libapache2-mod-scgi

会自动安装mod_scgi for Apache2。如果还没有安装Apache 2的话,Debian系统也会一并安装的。

需要特别指出的是,Debian稳定版中的libapache2-mod-scgi,版本是1.2-1,而我们需要的libapache2-mod-scgi至少要是1.7.0以上的,所以只有从unstable的pool中安装1.9-1版本的libapache2-mod-scgi。如何安装unstable的软件,需要如此这般这般...

在安装好合适版本的mod-scgi之后,剩下的工作就是配置Apache了。在/etc/apache2/mods-available目录下,可以发现文件scgi.load,其内容就是Load mod_scgi到Apache。还需要在该目录下建立scgi.conf文件,

$ sudo nano scgi.conf
< IfModule mod_scgi.c >
SCGIMount / 127.0.0.1:5001
< /IfModule >

这样,Apache的根就被指向了SCGI服务的5001端口,所有对/的访问,都将转向127.0.0.1:5001。

Debian系统下,还需要激活mod_scgi模块,

sudo /usr/sbin/a2enmod scgi

会在/etc/apache2/mods-enabled中建立scgi.load和scgi.conf的链接。重新启动Apache 2

$ sudo /etc/init.d/apache2 restart

现在就可以通过Apache2访问Pylons应用了。尽管配置简单了些,Apache 2 + SCGI还是正常工作了,速度也没有问题。

必须指出,上述配置还有应该注意的问题。scgi.conf中,把/指向了SCGI,这样Apache就不能进行其它服务了,而通常我们是给Pylons应用分配一个子路径,如/www.abc.com/myapp。如果用/myapp代替上述的/,就会发现,Pylons应用/下的东西访问不到了。Apache是把完整的URL传递给了SCGI,Pylons应用在进行URL解析的时候,不会认为是访问自己的/,而是以为访问/myapp子目录下的内容,所以实际输出的是Pylons应用/myapp下的东西。Pylons应用/下的内容,将永远访问不到。

解决上述问题的途径,可以有两个。一是,象网上大部分材料所做的那样,在Apache中使用Virtual Host,这样两个/就统一起来了;另外的办法是,修改Pylons应用的Mapping部分,将/myapp部分包含进去,以/myapp为基准。

前面虽然说的是SCGI访问Pylons,实际上对Paste Enabled的Web Application都是有效的。

另外,在Ubuntu系统下,Breezy的libapache2-mod-scgi也还是1.2-1版本,Dapper的才是1.9-1。还好,Dapper正式版离我们不远了。

0 Comments:

Post a Comment

<< Home