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

log*_*han 136 webserver ruby-on-rails nginx unicorn

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

既然Nginx和Unicorn都可以处理HTTP请求,那么在RoR应用程序中使用Nginx和Unicorn的组合需要什么?

Nic*_*ick 93

Nginx是一个纯Web服务器,用于提供静态内容和/或将请求重定向到另一个套接字以处理请求.

Unicorn是一个Rack web服务器,仅用于托管通常生成动态内容的"Rack App".Rack应用程序也可以提供静态内容,但效率低于大多数其他传统Web服务器.

大多数RoR设置使用传统Web服务器和Rack服务器的组合来充分利用它们的两种功能.通过代理平衡和提供静态内容,Nginx在请求重定向方面非常快.Unicorn非常有能力处理HTTP头并平衡对Ruby的入站请求以进行处理.


Agi*_*gis 67

这个答案是对其他答案的补充,并解释了为什么Unicorn需要nginx.

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

首先,没有任何东西阻止你在没有反向代理的情况下部署Unicorn .但是,这不是一个好主意; 让我们看看为什么.

Unicorn遵循Unix理念,即做一件事并做得很好,那就是为快速,低延迟的客户提供服务(我们将在后面看到这意味着什么).Unicorn专为快速,低延迟客户端设计的事实也意味着它对慢速,高延迟客户端来说并不是很好,这确实是事实.这是独角兽的薄弱环节之一,它是其中一个反向代理的用武之地:它坐落在麒麟面前,照顾那些缓慢的客户(我们将看到怎样后面).

幸运的是,这种反向代理已经存在并被称为nginx.

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

另一种决定可能是以不需要反向代理的方式设计Unicorn.但是,这意味着它必须实现额外的功能来完成现在nginx所做的所有事情,从而导致更复杂的代码库和更多的工程工作.

相反,它的创造者决定利用经过实战检验并设计得非常好的现有软件,避免浪费时间和精力解决其他软件已经解决的问题.

但是,让我们获得技术并回答你的问题:

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

以下是一些主要原因:

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

依赖反向代理意味着Unicorn 不需要使用非阻塞I/O. 相反,它可以使用阻塞I/O,它本身更简单,更容易让程序员遵循.

另外,如DESIGN文档所述:

[使用阻塞I/O]允许在Ruby解释器中遵循更简单的代码路径,并减少系统调用.

但是,这也有一些后果:

关键点#1:Unicorn对慢客户端效率不高

(为简单起见,我们假设有一个Unicorn工作者的设置)

由于使用了阻塞I/O,因此Unicorn工作者一次只能为一个客户端服务,因此慢速客户端(即连接速度慢的客户端)可以有效地让工作人员保持较长时间(比快速客户端会这样做) ).与此同时,其他客户端只会等到工作人员再次空闲(即请求将堆积在队列中).

为了解决这个问题,在Unicorn前部署了一个反向代理,它完全缓冲传入的请求  应用程序响应,然后分别将它们  中的每一个(也称为勺子提供)分别发送给Unicorn和客户端.在这方面,你可以说反向代理"屏蔽"Unicorn与慢速网络客户端.

幸运的是,Nginx是这个角色的一个很好的候选者,因为它旨在有效地处理数千个并发客户端.

至关重要的是反向代理应该在与Unicorn相同的本地网络内(通常在通过Unix域套接字与Unicorn通信的同一物理机器中),以便将网络延迟保持在最低限度.

因此,这样的代理有效地扮演了 Unicorn最初服务的快速客户端的角色,因为它快速代理对Unicorn的请求,并使工作人员在最短的时间内保持忙碌(与客户端的时间相比)连接速度慢会这样做.

关键点#2:Unicorn不支持HTTP/1.1 keep-alive

由于Unicorn使用阻塞I/O,这也意味着它不能支持HTTP/1.1 keep-alive功能,因为慢速客户端的持久连接会很快占用所有可用的Unicorn工作者.

因此,要利用HTTP keep-alive,请猜测:使用反向代理.

另一方面,nginx只需几个线程即可处理数千个并发连接.因此,它没有像Unicorn这样的服务器的并发限制(基本上限于工作进程的数量),这意味着它可以很好地处理持久连接.更多关于它如何实际工作的信息可以在这里找到.

这就是为什么nginx接受来自客户端的保持活动连接,并通过普通的Unix套接字通过普通连接将它们代理到Unicorn.

要点#3:Unicorn不擅长提供静态文件

同样,提供静态文件是Unicorn 可以做的事情,但不是为了有效地工作.

另一方面,像nginx这样的反向代理在它上面要好得多(即.sendfile(2)&caching).

更多

哲学文献中还概述了其他一些要点(参见"通过反向代理改进绩效").

另请参阅nginx的一些基本功能.

我们看到,通过利用现有软件(即nginx)并遵循"做一件事,做得好"的Unix理念,Unicorn能够遵循更简单的设计和实现,同时保持高效地服务Rack应用程序(例如.你的Rails应用程序).

有关更多信息,请参阅Unicorn的哲学设计文档,它们更详细地解释了Unicorn设计背后的选择以及为什么nginx被认为是Unicorn的良好反向代理.

  • @oMiKeY如果是这样的话,我相信其他答案相当不错.我仍然认为我的答案为试图理解nginx和独角兽的_combination_的人提供了有用的信息. (3认同)
  • 这是纯金.谢谢! (2认同)

Pra*_*tik 62

Nginx的
在此输入图像描述
独角兽
在此输入图像描述
有关更多信息, 请参阅github上的unicorn.

  • @loganathan,Apache和Nginx在提供静态内容方面要比ruby或任何应用程序服务器快得多.他们还知道如何处理缓存,并且擅长允许并发文件下载,同时仍然占用流量并将其传递给应用程序服务器. (17认同)
  • 这并没有回答为什么需要nginx的问题.它只是将它放在两张图片中而没有任何评论.尼克的回答要好得多. (9认同)
  • 此外,如果您有大量数据即将到来,nginx将从客户端缓冲它(并用勺子提供).如果没有nginx,您的独角兽将在上传/下载过程中被捆绑. (4认同)

bar*_*iir 14

Nginx可用于为独角兽服务器上的慢速客户端提供服务,因为慢速客户端会阻塞独角兽服务器.Nginx用作某种代理缓冲所有请求和响应慢速客户端.

http://unicorn.bogomips.org/