rails应用程序实际上如何工作?假设我们有nginx +乘客+ Ubuntu,所以我的问题是:
请不要给我答案,如“ nginx处理请求”;我需要更多的东西,或者你可能知道我可以阅读的内容。
答案 0 :(得分:4)
这将有助于以这种方式理解故事:
很久以前,当网络是新的时,只有静态页面 - 只有.html
个页面。因此,Web服务器软件将有效地读取文件并将文件的内容发送给请求者(浏览器)。
然后是动态网络。这里必须动态生成页面内容,以响应请求。这意味着,必须在服务器上运行一些程序,它可以理解所请求的内容以及响应的内容。这导致了CGI (Common Gateway Interface)
的诞生。现在,您可以在服务器上执行.html
程序,而不是读取CGI
文件并将其内容发送到客户端,该程序将显示可以发送给请求者的html
。这些CGI脚本可以用各种编程语言编写。
随着CGI脚本日益复杂,需要专门的帮助应用程序来抽象出所有常见(和机械)逻辑。这将简化编写业务逻辑。这些专业助手通常称为application servers
或containers
。
这些容器还有助于保持Web服务器的简单和精简,因为执行cgi脚本的复杂性(无论它编写的是哪种编程语言)现在都被委托给Web服务器。所有Web服务器需要知道的是,如果请求URL以.php
结尾,那么它应该将请求委托给FASTCGI
,或者如果URI以/javaapp/
开头,则将其委托给tomcat
等。让我们将这些帮助应用程序称为APP SERVERS
或Container
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体系结构概述文档解释了它。