Rails 应用程序中 nginx 或 apache 的职责是啥?
Posted
技术标签:
【中文标题】Rails 应用程序中 nginx 或 apache 的职责是啥?【英文标题】:what is the responsibility of ngnix or apache in rails application?Rails 应用程序中 nginx 或 apache 的职责是什么? 【发布时间】:2013-11-13 00:49:13 【问题描述】:rails 应用程序实际上是如何工作的?假设我们有 nginx + 乘客 + Ubuntu,所以我的问题是:
nginx 实际上在做什么? 它如何将请求传输到 rails 应用程序? 乘客负责什么? 什么是机架? rails 应用程序实际上如何在没有 apache 的情况下仅在 webrick 上运行?请不要给我诸如“nginx 处理请求”之类的答案;我需要更多的东西,或者你可能知道我可以从哪里读到这方面的资料。
【问题讨论】:
老兄,你机器上的“Enter”键坏了吗?和点一起? @SergioTulentsev 我猜文字是minified :) 【参考方案1】:这样理解故事会有所帮助:
很久以前,当网络还是新的时候,只有静态页面——只有.html
页面。因此,网络服务器软件将有效地读取文件并将文件内容发送给请求者(浏览器)。
然后是动态网络。在这里,页面的内容必须动态生成,以响应请求。这意味着,必须有一些程序在服务器上运行,它了解请求的内容和响应的内容。这导致了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
知道如何加载和执行它。
注意:
我已尝试为您简化概念。这远非一个完整的解释。希望这足以让您开始自学。
【讨论】:
【参考方案2】:Phusion 乘客作者在这里。我认为这两个文件详细解释了您的大部分问题。
Ruby on Rails server options - Rails、Apache/Nginx、Passenger、Capistrano 和其他东西有什么关系? Phusion Passenger architectural overview对于 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 乘客架构概述文档对此进行了解释。
【讨论】:
以上是关于Rails 应用程序中 nginx 或 apache 的职责是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Rails + (Phusion Passenger|Puma|Unicorn|Thin) + (Nginx|Apache) 如何协同工作?
使用Passenger和Apache在vps上部署我的rails应用程序
Elastic Beanstalk & Rails - nginx 错误“未定义的局部变量或方法‘location_config_filename’”