在rails应用程序中nginx或apache的责任是什么?

时间:2013-11-01 18:39:10

标签: ruby-on-rails apache nginx passenger

rails应用程序实际上如何工作?假设我们有nginx +乘客+ Ubuntu,所以我的问题是:

  • nginx究竟在做什么?
  • 如何将请求转移到rails app?
  • 乘客负责什么?
  • 什么是机架?
  • 实际上rails应用程序如何在没有apache的webrick上工作?

请不要给我答案,如“ nginx处理请求”;我需要更多的东西,或者你可能知道我可以阅读的内容。

2 个答案:

答案 0 :(得分:4)

这将有助于以这种方式理解故事:

很久以前,当网络是新的时,只有静态页面 - 只有.html个页面。因此,Web服务器软件将有效地读取文件并将文件的内容发送给请求者(浏览器)。

然后是动态网络。这里必须动态生成页面内容,以响应请求。这意味着,必须在服务器上运行一些程序,它可以理解所请求的内容以及响应的内容。这导致了CGI (Common Gateway Interface)的诞生。现在,您可以在服务器上执行.html程序,而不是读取CGI文件并将其内容发送到客户端,该程序将显示可以发送给请求者的html。这些CGI脚本可以用各种编程语言编写。

随着CGI脚本日益复杂,需要专门的帮助应用程序来抽象出所有常见(和机械)逻辑。这将简化编写业务逻辑。这些专业助手通常称为application serverscontainers

这些容器还有助于保持Web服务器的简单和精简,因为执行cgi脚本的复杂性(无论它编写的是哪种编程语言)现在都被委托给Web服务器。所有Web服务器需要知道的是,如果请求URL以.php结尾,那么它应该将请求委托给FASTCGI,或者如果URI以/javaapp/开头,则将其委托给tomcat等。让我们将这些帮助应用程序称为APP SERVERSContainer

Passenger是一个这样的容器,用于运行RACK应用程序。

什么是Rack:您可以说,Rack是容器加载应用程序(如Rails应用程序)的标准化接口,就像CGI是标准化接口一样Web服务器执行外部程序,

Rack为应用程序框架定义了一个标准接口(rails,merb,sinatra等)。如果应用程序框架符合机架接口,container知道如何加载和执行它。

注意:

我试图为您简化超级简化概念。这绝不是一个完整的解释。希望这足以让你开始自学。

答案 1 :(得分:2)

Phusion Passenger作者在这里。我认为这两个文件详细解释了你的大多数问题。

至于Rack:它是一个标准化的界面。不同的Web服务器往往具有用于动态应用程序的不同API。为了避免每个Ruby框架都需要为每个服务器编写适配器,所有Ruby框架都实现了Rack接口。反过来,所有服务器也会使用Rack。这允许您在不需要框架的情况下在不同服务器之间切换,并且允许您在不同框架之间切换,而无需服务器对该框架提供特殊支持。

WEBRick如何服务Rails?当您启动WEBrick时,它会在某个端口上打开TCP套接字并侦听其上的连接。当新连接进入时,它会将数据解析为HTTP,创建内部数据结构,并通过调用Rails Rack对象将这些数据结构传递给Rails。 Rails Rack对象是进入Rails的主要入口点,在程序启动期间创建。当Rack对象返回时,WEBrick将返回的数据结构转换为HTTP数据并将其写入套接字。

这个高级描述几乎描述了每个Ruby服务器的工作原理。 Phusion Passenger也是这样的高级别工作,但是涉及更多的步骤,例如,流程管理,负载平衡,安全检查等.Phusion Passenger处理大部分进程,而WEBrick完全是进程中的库。 Phusion Passenger体系结构概述文档解释了它。