关于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?
-------------------------------------------------------------------------------------------------------------------------------------------------------
现在这类脚本语言的运行方式基本上有三种:
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提高静态资源的处理能力。这种方式大家都很熟悉了,不用多说。