什么是 Ruby 中的 Rack?什么是 Ruby 中的 Puma?

6
根据定义,Puma是一种Web服务器,而Rack是Web服务器和应用服务器之间的接口。
但是,许多视频提到Rack是Web框架和Web服务器之间的接口。所以我可以这样理解,我们使用Web框架来构建应用程序,因此Rack是Web框架和Web服务器之间的接口?
另一个问题是,如果Puma是一种Web服务器,那么我可以使用Apache或Nginx来替换它吗?

1
我找到了一篇关于使用Puma和Nginx部署Rails应用的文章。它说:“由于Puma并不是设计用于直接被用户访问的,因此我们将使用Nginx作为反向代理,缓冲用户与您的Rails应用程序之间的请求和响应。”为什么Puma不能直接被用户访问? - Vic Xu
1个回答

9
Puma是一个应用服务器,更具体地说是一个Rack应用服务器。(除了Puma之外还有其他的服务器:如Unicorn、Passenger等。也有针对不同接口的应用服务器;例如,Tomcat和JBoss是Java应用服务器。) 应用服务器接受HTTP请求,将其解析为应用程序语言中的结构,将其交给应用程序处理,并等待返回响应对象,然后将其返回给客户端。
Nginx/Apache是通用的Web服务器。Apache不知道如何提供Rack应用程序服务,而Puma不知道如何执行Nginx/Apache执行的一堆其他任务(例如:CGI脚本、URL重写、代理、负载均衡、黑名单等)。
Rack是Ruby的一个库,它接受来自应用服务器的解析HTTP请求,并将它们通过可配置的中间件堆栈(例如会话处理)传递给处理程序,并将响应对象返回给应用服务器,使得在Ruby中进行Web开发变得容易。您可以直接执行Rack应用程序(或者更确切地说,使用与Rack一起安装的非常简单的服务器),但不建议在开发以外使用,这就是“正确”的应用服务器发挥作用的地方:它们知道如何保持您的应用程序处于活动状态,如果应用程序死机则重新启动它,保证有预定数量的线程运行等等。
因此,通常情况下,您的Web服务器接受连接,然后使用simple reverse proxy将适当的请求传递给正在Rack应用程序内部执行的Rack应用程序服务器。这样可以使您从所有涉及的组件中获得好处。

2
Rack不解析HTTP。这是应用服务器的工作。Rack获取请求(包括在Ruby Hash中解析的HTTP标头),通过各种中间件处理它,最后将其交给应用程序(例如Rails应用程序)。应用服务器再将其转换为HTTP响应并将其返回给客户端。因此,尽管Rack中的语义模拟了HTTP,但它实际上从未看到“原始”的HTTP。 - Holger Just
2
此外,要“直接执行Rack应用程序”,您还可以使用像Webrick这样的应用服务器。 在这方面,“Web服务器”和“应用程序服务器”的界限有点模糊。因为两种类型都可能解析HTTP并使用不同的协议(如Rack、CGI、WSGI等)将请求移交给内容处理程序。 - Holger Just
@HolgerJust 您说得没错;我过于简化了。等我回到键盘前会进行修复。 - Amadan
实际上,puma是一种应用服务器,用于管理进程和内存,对吧?谢谢你的详细解释。 - Vic Xu
1
WSCH是一家广播电台。WSGI类似于Rack,适用于Python。Django和CherryPy是类似于Ruby的Rails和Sinatra的Python Web框架。 - Amadan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接