NGNIX或Apache 在 Rails 应用中的责任是什么?



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

  • nginx到底在做什么?
  • 它如何将请求传输到轨道应用程序?
  • 乘客负责什么?
  • 什么是机架?
  • 实际上,rails 应用程序如何在没有 apache 的情况下只在 webrick 上运行?

请不要给我"nginx处理请求"之类的答案;我需要更多的东西,或者你可能知道我可以阅读这个的来源。

这样理解

故事会有所帮助:

很久以前,当网络还很新的时候,只有静态页面——只有.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知道如何加载和执行它。

注意:

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

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

  • Ruby on Rails服务器选项 - Rails,Apache/Nginx,Passenger,Capistrano和其他东西有什么关系?
  • 富松客运建筑概述

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

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

这个高级描述几乎描述了每个 Ruby 服务器的工作原理。Phusion Passenger 在高层次上也是这样工作的,但是在流程管理、负载平衡、安全检查等方面涉及更多步骤。 Phusion Passenger 处理大多数进程外的东西,而 WEBrick 是一个完全进程内的库。Phusion Passenger 架构概述文档对此进行了解释。

最新更新