论坛首页 综合技术版 python

[提问]Python Web Server. Share Nothing?

浏览 2988 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2006-09-18 关键字: Python
关于Ruby Rails的Web部署的粗浅认识:
Mongrel 和 Webrick 是两个stand alone ruby web server。(is there more?)
可以单独运行,当然也可以和 apache / lightttpd 组合使用。
这两个web server是进程模型,不能共享server memory,所以是shared nothing。

另一种方式是,fastcgi 和 apache / lightttpd 组合使用。
fastcgi is not stand alone,不能独立运行。
这种组合方式也是进程模型,不能共享server memory,所以是shared nothing。

那么,Python的情况呢? Python web server 也是share nothing?
Zope, Plone的安装文档我简单看了一下,好像Web Server也都可以单独运行,也可以和apache / lightttpd 组合使用。
我搜索了一下 python web server,发现了一些 Python Application Server。

不知道,Zope等 Python Web Server 的模型是怎样的?
是不是进程模型?能否共享Server Memory?是否Share Nothing?
   
时间:2006-09-18
zope是一个应用服务器,有点类似了Java的应用服务器,只不过提供的功能更多了,除了应用服务器本身的功能之外,还提供了zodb,提供了全套基于web的开发和部署功能。
   
0 请登录后投票
时间:2006-09-18
应用服务器,就是说,可以共享server memory?
搜索了一下zope, cache,好像zope cache是同一个server vm里面。
   
0 请登录后投票
时间:2006-09-18
现在这类脚本语言的运行方式基本上有三种:

1、Apache Module方式

由Apache进程用module方式来管理,web请求的静态页面和动态请求都是由apache进程内部直接处理掉了。典型的如mod_php,mod_ruby,mod_perl,mod_python。这种方式目前PHP和Perl比较多的采用。这种方式其实还是非常成熟的,apache对于内存管理已经很好,运行效率各方面都很不错。当然apache进程之间也是SNA。

但是ruby和python一般不建议用这种方式,这是因为PHP和Perl解析器的开销非常小,以Apache Module方式跑很灵活而且不怎么消耗资源;而ruby和python的解析器开销非常大,用这种方式,很浪费资源。例如一个PHP解析器跑起来才消耗2MB内存,一般也就7-8MB。但是ruby解析器跑起来就是30MB内存,消耗多的时候高达200多MB。由于很多apache进程只是在处理静态资源,完全没有必要带着一个庞大的ruby在跑,因此就显得过于浪费了。

2、FastCGI/SCGI

ruby on rails很流行使用FastCGI,Python则流行SCGI,也是SNA,比上面的方案在部署和cluster方面要灵活的多。这种方式下,web server处理静态资源,将动态请求通过Unix Socket/TCP端口发送给后面的ruby/python进程来处理。一般来说,页面带有很多静态资源,因此一次用户的动态请求实际上对应了web server的好几个连接去处理静态资源,和一个后台ruby进程去处理动态资源。因为把静态资源和动态请求分开了,所以不再需要那么多的ruby进程来跑。据说一般经验公式是:apache进程数量如果是70个的话,那么FastCGI方式的ruby进程只需要开10个,7:1的比例。另外每个ruby进程在执行一次之后就会hold住这个数据库连接,以后就会直接使用了,避免了数据库连接的开销,已经类似Java的数据库连接池的作用了。

JavaEye2.0现在开了30个FastCGI的ruby进程,但是据我观察,大部分繁忙的时候,真正被用到的ruby进程也只有十几个而已。

3、ServerVM

Java和Zope都是这种方式,一个单一进程在跑,里面很多线程分别处理不同的动态请求,shared memory方式。有时候也会在前面放一个web server提高静态资源的处理能力。这种方式大家都很熟悉了,不用多说。
   
0 请登录后投票
时间:2006-09-18
great thanks to Robbin for the detail answer.

关于rails大容量网站部署的性能讨论
http://www.javaeye.com/topic/20298
robbin 写道

FastCGI/SCGI/mongrel方式部署
再看rails群集方案:
Apache2.2 proxy分发请求给后面n个mongrel实例;
每个mongrel实例也是无状态的,用户标示使用cookie,从apache收到一个请求以后,自行处理,然后返回给apache。
.....
也许,ruby的解析执行速度比Java慢,由于没有数据库连接池导致每个请求需要多消耗一些建立物理连接的时间。但是这些因素只能导致单个用户请求的响应时间比Java慢,不会导致整个网站的负载能力差。
.....
2、数据库连接池,对于mongrel,我觉得增加数据库连接池是完全做得到的事情。不过即使不增加连接池,这里也不会成为系统瓶颈,最多会导致数据库多花一些时间在处理连接的建立和断开上面。

最后这种群集部署方案下面,web server退化成为一个请求分发代理,找不到任何理由使用apache了,对,是lighthttpd出场kick off apache的时候。如果网站容量大到连lighthttpd都无法及时分发请求的时候,你还可以用四层交换机来分发请求,那lighthttpd也该被 kick off了。


robbin 写道

这种方式下,web server处理静态资源,将动态请求通过Unix Socket/TCP端口发送给后面的ruby/python进程来处理。

这个功能比较强。不知道web server(Apache/Lighttpd)是如何分辨静态资源和动态资源的。
要明白这一块,应该看哪方面的文档? fastCGI/SCGI or Apache/Lighttpd ?

robbin 写道

另外每个ruby 进程在执行一次之后就会hold住这个数据库连接,以后就会直接使用了,避免了数据库连接的开销,已经类似Java的数据库连接池的作用了。

这些ruby进程都是那种endless loop? 跑完一次,就等待下一个请求?类似于进程池吧?
要明白这一块,应该看哪方面的文档? fastCGI or Apache/Lighttpd ?
   
0 请登录后投票
时间:2006-09-18
一般web server是通过URL后面的mime type来识别资源类型的,例如css,js,gif,html这种就不用说了。另外就是web server自己也可以配置URL映射规则,规则要参考具体web server的文档。

FastCGI方式部署,在《Agile Web Development with Rails》第22章谈的比较详细,另外lighttpd自己的文档也介绍了很多。

ruby进程一直跑的,你可以理解为进程池的方式。
   
0 请登录后投票
时间:2006-09-18
布娃娃:webrick是根本不支持并发访问的,所以也谈不上share什么。别的robbin都说了。ruby基本就是长连接到数据库,但是因为fcgi的‘进程池’效果,所以不需要太多数据库连接,对数据库连接池要求也不是那么迫切了。
   
0 请登录后投票
论坛首页 综合技术版 python

跳转论坛:
JavaEye推荐