Apache 和 Nginx都能作为反向代理,就是说他们能够把进来的 HTTP 请求发给其他服务器,接着把该服务器的 HTTP 响应转给客户端,后面会看到为什么和这个有关系。
二,Mongrel以及其他production环境的服务器 vs WEBrick
Mongrel是Ruby实现的应用服务器,具体来说:
1,在自己的进程空间中加载 Ruby 应用。
2, 创建一个 TCP socket,允许它可以和外部世界通信(例如Internet)。Mongrel 在这个socket上监听 HTTP 请求,并把请求数据转发给 Ruby 应用。
3,Ruby 应用返回一个描述 HTTP 响应的对象,Mongrel 将其转换为真正的 HTTP 响应字节,并发回到 socket 中。
然而 Mongrel 已经不再维护了,其他替代的服务器是:
Phusion Passenger
Unicorn
Thin
Puma
Trinidad (JRuby only)
TorqueBox (JRuby only)
接下来我会讲一讲他们和 Mongrel 的区别
WEBrick 和 Mongrel 很像,区别如下:
WEBrick 不适合用于 production。WEBrick 完全是用 Ruby 写的;Mongrel( 以及其他 Ruby 应用服务器)是部分 Ruby 部分C,主要是 Ruby,但它的 HTTP 解析器为了性能是用 C 写的。
WEBrick 速度比较慢而且不够强壮,有普遍知道的内存泄漏问题,以及 HTTP 解析问题。论文网
因为 WEBrick 是 Ruby 默认自带的,所以 WEBrick 经常用于 development 环境下作为默认服务器,而其他的服务器则需要另外安装。不建议在production 环境下使用 WEBrick 服务器,虽然因为某些原因,Heroku 选择了WEBrick 作为默认服务器,他们以前使用的是 Thin,但我不知道他们为什么换到了 WEBrick。
三,应用服务器世界
当前所有的Ruby 应用服务器都是 HTTP 类型的,一些服务器直接将80端口暴露到 Internet 中,另一些则没有。
暴露80端口的:Phusion Passenger, Rainbows。
没有直接暴露的:Mongrel, Unicorn, Thin, Puma。这些服务器必须必须置于反向代理服务器之后,比如Apache 和 Nginx。
我不了解 Trinidad 和 TorqueBox,所以就忽略了。
为什么有些服务器需要置于反向代理之后?
某些服务器的每个进程在同一时间只能处理一个请求,如果想同时处理两个请求,你就需要启动多个服务器实例,都伺服同一个 Ruby 应用。这种应用服务器进程的集合称为应用服务器集群(比如Mongrel Cluster, Thin Cluster)。然后你必须启动 Apache 或者 Nginx,给集群做反向代理,Apache/Nginx 会处理好集群中不同应用实例间的请求分发。(更多内容参见章节 "I/O并发模型”)
Web 服务器可以缓存请求和响应。有些客户端发送数据、接收数据的速度缓慢,你当然不希望应用服务器在等待客户端收发数据时什么也不干,Web 服务器可以隔离应用服务器和慢客户端。Apache 和 Nginx 擅长同时很多事情,因为他们是多线程或者基于事件的。
大多数的应用服务器可以伺服静态文件,但不擅长,而Apache 和 Nginx可以更快速度处理这件事情。
人们经常直接使用Apache 或者 Nginx伺服静态文件,而不会处理需要转发的请求(forward requests),这是比较安全的策略。Apache 和Nginx足够聪明,可以保护应用服务器远离恶意请求。
为什么有些服务器可以直接暴露在Internet中?
Phusion Passenger 和其他应用服务器不一样,其中一个特点是可以融入其他服务器。
Rainbows 的作者公开指出,Rainbows 可以直接暴露在 Internet 中。他非常确认在解析 HTTP 过程中不会轻易遭受攻击。当然,作者也并不做任何担保,并表示不同应用环境下有其相应的风险。 Rubyonrails服务器英文文献和中文翻译(5):http://www.youerw.com/fanyi/lunwen_77918.html