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. 相反,它可以使用阻塞I/O,它本身更简单,更容易让程序员遵循.
另外,如DESIGN文档所述:
[使用阻塞I/O]允许在Ruby解释器中遵循更简单的代码路径,并减少系统调用.
但是,这也有一些后果:
(为简单起见,我们假设有一个Unicorn工作者的设置)
由于使用了阻塞I/O,因此Unicorn工作者一次只能为一个客户端服务,因此慢速客户端(即连接速度慢的客户端)可以有效地让工作人员保持较长时间(比快速客户端会这样做) ).与此同时,其他客户端只会等到工作人员再次空闲(即请求将堆积在队列中).
为了解决这个问题,在Unicorn前部署了一个反向代理,它完全缓冲传入的请求和 应用程序响应,然后分别将它们 中的每一个(也称为勺子提供)分别发送给Unicorn和客户端.在这方面,你可以说反向代理"屏蔽"Unicorn与慢速网络客户端.
幸运的是,Nginx是这个角色的一个很好的候选者,因为它旨在有效地处理数千个并发客户端.
至关重要的是反向代理应该在与Unicorn相同的本地网络内(通常在通过Unix域套接字与Unicorn通信的同一物理机器中),以便将网络延迟保持在最低限度.
因此,这样的代理有效地扮演了 Unicorn最初服务的快速客户端的角色,因为它快速代理对Unicorn的请求,并使工作人员在最短的时间内保持忙碌(与客户端的时间相比)连接速度慢会这样做.
由于Unicorn使用阻塞I/O,这也意味着它不能支持HTTP/1.1 keep-alive功能,因为慢速客户端的持久连接会很快占用所有可用的Unicorn工作者.
因此,要利用HTTP keep-alive,请猜测:使用反向代理.
另一方面,nginx只需几个线程即可处理数千个并发连接.因此,它没有像Unicorn这样的服务器的并发限制(基本上限于工作进程的数量),这意味着它可以很好地处理持久连接.更多关于它如何实际工作的信息可以在这里找到.
这就是为什么nginx接受来自客户端的保持活动连接,并通过普通的Unix套接字通过普通连接将它们代理到Unicorn.
同样,提供静态文件是Unicorn 可以做的事情,但不是为了有效地工作.
另一方面,像nginx这样的反向代理在它上面要好得多(即.sendfile(2)
&caching).
哲学文献中还概述了其他一些要点(参见"通过反向代理改进绩效").
我们看到,通过利用现有软件(即nginx)并遵循"做一件事,做得好"的Unix理念,Unicorn能够遵循更简单的设计和实现,同时保持高效地服务Rack应用程序(例如.你的Rails应用程序).
有关更多信息,请参阅Unicorn的哲学和设计文档,它们更详细地解释了Unicorn设计背后的选择以及为什么nginx被认为是Unicorn的良好反向代理.
归档时间: |
|
查看次数: |
32210 次 |
最近记录: |