Wednesday, 29 March 2006

Flup之分布式SCGI服务

前一篇里,提到“从配置的形式上看,SCGI是可以进行分布式部署的,Web Server和Web App不必在同一台机器上”。昨晚,被xlp223抓住,尽管有些困,也不得不跟着学习一下,结果xlp223试验成功了。在缺省配置下,Paster是将SCGI限制为只能本地访问。如果要从外部访问SCGI Service,需要在Pylons配置文件中增加allowedServers选项。

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

这里192.168.0.1是Web Server的IP地址,允许该地址访问SCGI Service。

接下来考虑到的是Web Server和Web App多对多映射的问题,即一个Web Server连接多个Web App,而一个Web App又对多个Web Server提供服务。

一个Web Server连接多个Web App,对于mod_scgi的SCGIMount这种redirect方式,显然是没有问题的,只要将不同的Web App分别mount到不同的路径就行了。

一个Web App对多个Web Server提供服务,对于现有的flup 0.5来讲,是采用限制IP的方法。Flup提供给Paste的接口,在PasteScript-0.5-py2.4.egg/paste/script/flup_server.py中,形式如下,

...
def run_scgi_thread(wsgi_app, global_conf,
scriptName='', host='localhost', port='4000',
allowedServers='127.0.0.1'):
...

allowedServers的缺省值是'127.0.0.1',只对本机开放。如不限制IP,Paste就必须将allowedServers设成None。同时,如果在配置文件中列出了IP地址,run_scgi_thread函数会自动转换成一个list。这一点比较有用,可以接受多个IP地址。

在flup-0.5-py2.4.egg/flup/server/scgi_base.py中,class BaseSCGIServer的_isClientAllowed是测试到访的IP地址是否是允许的IP。注意这一行代码:

    ret = self._allowedServers is None or addr[0] in self._allowedServers

对于allowedServers为None的情况,允许。后半句是test IP是否在allowedServers list里面。

所以,如果要一个Web App对多个Web Server,只要在配置文件里把允许的IP地址都列上就行了。尽管这里不支持192.168.0.*或192.168.0.0/24这样的形式,但在实际应用中也没有多少影响,毕竟这里的“多”也不会太多。

对分布式部署来讲,一个重要的东西是动态负载平衡(load-balancing),这一点在Flup的SCGI上,目前还不知道如何实现。xlp223讲,文档上说AJP可以,不知道是怎么玩的。

0 Comments:

Post a Comment

<< Home