1

How rails applications actually work? Let's say we have nginx + passenger + Ubuntu, so my questions are:

  • What is nginx actually doing?
  • How does it transfer requests to the rails app?
  • what is passenger responsible for?
  • And what is rack?
  • How actually rails app can work just on webrick without apache?

Please dont give me answers like "nginx processes the requests"; I need something more, or may be you know the source where I can read about this.

4

2 回答 2

5

这样有助于理解这个故事:

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

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

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

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

乘客就是这样一个容器,它旨在运行 RACK 应用程序。

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

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

笔记:

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

于 2013-11-01T19:02:05.907 回答
2

Phusion 乘客作者在这里。我认为这两个文件详细解释了您的大部分问题。

至于 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 乘客架构概述文档对此进行了解释。

于 2013-11-01T21:42:27.447 回答