为什么Unicorn需要和Nginx一起部署?

我想知道Nginx和Unicorn的区别。 据我所知,Nginx是一个Web服务器,而Unicorn是一个Ruby HTTP服务器。

由于Nginx和Unicorn都可以处理HTTP请求,因此需要将Nginx和Unicorn组合用于RoR应用程序。

Nginx的
在这里输入图像说明
独angular兽
在这里输入图像说明
请参阅github上的独angular兽了解更多信息。

Nginx是一个纯粹的Web服务器,用于提供静态内容和/或将请求redirect到另一个套接字来处理请求。

独angular兽是一个机架式networking服务器,只用于托pipe一个通常会产生dynamic内容的“机架式应用”。 机架上的应用程序也可以提供静态内容,但它比大多数其他传统的Web服务器效率低。

大多数RoR设置使用传统Web服务器和机架服务器的组合来应用其两者的最佳function。 Nginx通过代理平衡和静态内容提供请求redirect的速度非常快。 独angular兽能够处理HTTP标头,并平衡入站请求到Ruby进行处理。

这个答案是其他的补充,并解释了为什么独angular兽需要在它前面的nginx

TL; DR Unicorn通常与像nginx这样的反向代理一起部署的原因是因为它的创build者故意devise它,所以为了简单起见进行权衡。

首先,如果没有反向代理服务器,就没有什么能够部署Unicorn。 但是,这不是一个好主意, 让我们看看为什么。

Unicorn遵循Unix的理念,即做一件事,做好一件事 ,那就是服务快速,低延迟的客户端 (我们稍后会看到这个意思)。 Unicorn专为快速,低延迟客户端devise的事实也意味着它对慢速,高延迟客户端来说并不是很好,这确实是事实。 这是Unicorn的弱点之一,也是一个反向代理发挥作用的地方:它位于Unicorn前面,照顾那些慢速的客户端 (我们将在后面看到)。

幸运的是,这样一个反向代理已经存在,被称为nginx 。

只处理快速客户端的决定,大大简化了Unicorn的devise,并允许一个更简单和更小的代码库,代价是部署部门增加了一些复杂性(也就是除了Unicorn之外你还必须部署nginx)。

一个替代的决定可能是devise麒麟的方式,它不会需要一个反向代理。 然而,这意味着它将不得不实现额外的function来完成现在nginx所做的所有事情,从而导致更复杂的代码库和更多的工程devise工作。

相反,其创build者决定利用现有的经过testing和devise的软件,避免浪费时间和精力解决其他软件已经解决的问题。

但让我们得到技术和回答你的问题:

为什么Unicorn需要和nginx一起部署?

以下是一些关键的原因:

Unicorn为客户端使用阻塞I / O

依靠反向代理意味着Unicorn 不需要使用非阻塞I / O。 相反,它可以使用阻塞I / O,这对于程序员来说本质上是更简单和更容易遵循的。

同样的devise文件指出:

[使用阻塞I / O]允许在Ruby解释器中遵循更简单的代码path,更less的系统调用。

但是,这也有一些后果:

关键点1:独angular兽对低速客户端效率不高

(为了简单起见,我们假设有一名独angular兽工人)

由于使用了阻塞I / O,因此一个独angular兽工作者一次只能服务一个客户端 ,所以一个慢速客户端(即连接速度慢的客户端)可以有效地使工作者保持较长时间的忙碌状态(比快速客户端)。 同时,其他客户将等待,直到工人再次释放(即请求会堆积在队列中)。

为了解决这个问题,在Unicorn前面部署了一个反向代理,这个代理完全caching了传入的请求应用程序响应,然后分别将它们分别发送给Unicorn和客户端。 在这方面,你可以说反向代理将“独angular兽”从慢速networking客户端“屏蔽”起来。

幸运的是Nginx是这个angular色的最佳人选,因为它可以有效地处理成千上万个并发客户端。

反向代理应该与Unicorn处于同一个本地networking(通常在同一台物理机通过Unix域套接字与Unicorn进行通信)是至关重要的,这样可以将networking延迟降至最低。

所以这样一个代理有效地扮演了Unicorndevise首先提供的快速客户端的angular色,因为它代表了Unicorn的请求速度,并且让工作人员在最短的时间内忙着工作 (相比于客户端有多less时间与一个缓慢的连接会做)。

关键点#2:Unicorn不支持HTTP / 1.1保持活动状态

由于Unicorn使用阻塞I / O,这也意味着它不能支持HTTP / 1.1保持活动function,因为慢速客户端的持续连接会迅速占用所有可用的麒麟工作者。

因此,为了利用HTTP keep-alive,猜测:使用了一个反向代理。

另一方面,nginx可以使用几个线程处理数千个并发连接。 因此,它没有像Unicorn那样的服务器的并发限制(基本上限于工作进程的数量),这意味着它可以处理持久连接。 在这里可以find更多关于这个实际工作的信息 。

这就是为什么nginx接受来自客户端的keep-alive连接,并通过一个Unix套接字通过普通连接代理它们到Unicorn。

第三点:独angular兽不擅长静态文件

再一次,提供静态文件是独angular兽可以做的事情,但不是为了有效地执行而devise的。

另一方面,像nginx这样的反向代理虽然在它上面更好(即sendfile(2) &caching)。

更多

在哲学文件中还有其他一些要点(请参阅“通过反向代理提高性能” )。

另请参阅nginx的一些基本特性 。

我们看到,利用现有的软件(例如nginx),遵循Unix“做一件事,做得好”的哲学理念,Unicorn能够更简单的devise和实现,同时保持高效的服务Rack应用程序。你的Rails应用程序)。

欲了解更多信息,请参阅独angular兽的哲学和devise文档,更详细地解释了独angular兽devise背后的select,以及为什么nginx被认为是独angular兽的一个很好的反向代理。

Nginx可以用来为独angular兽服务器上的慢速客户端服务,因为慢速客户端会扼杀独angular兽服务器。 Nginx被用作某种caching所有请求和caching客户端响应的代理。

http://unicorn.bogomips.org/