我可以为 Ruby 应用程序嵌入式 HTTP/HTTPS 服务器提供哪些选项?

3

我正在制作一些游戏服务器。就像其他游戏服务器一样,我认为服务器应该是有状态的(以后可能会改变,但目前我正在寻找有状态的解决方案)。

在使用Rake玩了一段时间之后,我决定在Ruby中寻找一个解决方案。我的要求如下:

  • 可嵌入的HTTP服务器库,可集成长时间运行的Ruby应用程序。(进程内库)
  • 应支持裸骨HTTP请求/响应处理。没有修饰、URL分配或网页模板。(我从不需要)
  • 应提供硬单线程模式。
  • 应支持带有自签名证书的HTTPS。
  • 可靠,并在生产中得到验证。
  • 文档清晰,社区庞大。

我认为最类似的例子是集成到node.js中的HTTP服务器。基本上是在TCP套接字的顶部添加了一个薄层。

它不需要支持多线程。我想为每个CPU内核运行一个独立的进程,而且我需要快速开发,所以目前要避免多线程。

我已经查看了Rack,看起来只是一个协议规范,并不是实际的实现。而且它似乎只适用于无状态的Web应用程序。如果我理解有误,请纠正我。

那么,在Ruby中有哪些选项可供选择?

3个回答

4

经过仔细重新评估您的问题,我可能已经找到了另一种解决方案。

也许你只需要一个简单的TCP套接字服务器。可以使用Ruby核心类来创建一个原始的HTTP 1.0服务器,代码如下:

require 'socket'

server = TCPServer.open(80)
loop do
  client = server.accept

  response = "<html>...</html>"
  headers = ["HTTP/1.0 200 OK",
             "Content-Type: text/html",
             "Content-Length: #{response.length}"].join("\r\n")

  client.puts headers
  client.puts "\r\n\r\n"
  client.puts response

  client.close
end

请查看以下资源:


这些资源可以帮助你学习Ruby的Socket编程。

谢谢你的另一个答案。我曾经考虑过,但是因为我认为这对于我的当前进展来说是过早的优化而排除了它。但我感觉很快就会需要它。 - eonil

2
总的来说,如果你想知道关于 Ruby 相关选项的问题,最好的资源是The Ruby ToolboxWeb 服务器类别列出了许多选项。最受欢迎的服务器有:
  • Thin
  • Passenger(可以独立使用或与 Apache Web 服务器一起使用)
  • Unicorn
  • Mongrel
以下是对你要求的一些注释:
  • 你最好思考“Web 服务器嵌入我的应用程序”而不是“我将服务器嵌入我的应用程序”。
  • 在生产中,你需要始终拥有多个应用程序实例,因为大多数 Ruby Web 服务器都是这样工作的。(因为多线程在 Ruby 及其实现中是一个棘手的问题
就个人而言,我使用 Thin 和 Passenger 都非常成功。组合“开发阶段使用 Thin,在生产中使用 Passenger”似乎也很常见。
PS:您没有提及任何网络框架。即使您想尽可能地减少应用程序的重量,一个简单的网络框架也可以帮助您省去大量的样板代码。 (The Ruby Toolbox: Web App Frameworks)

正如我在问题中澄清的那样,我正在寻找一个可以集成到我的有状态、长时间运行的应用程序中的HTTP服务器,而不是一个无状态、短时间运行的Web应用程序容器服务器。 - eonil
很抱歉我的回答没有帮到你,但是 - 恭敬地说 - 你似乎缺少一些关于Web服务器的基础知识。如果您的应用程序是有状态的,这并不意味着您的服务器进程也必须是有状态的。此外,所有命名服务器都可以使您的应用程序正常运行,因此也不存在冲突。 - Daniel Rikowski
Phusion Passenger旨在运行于外部进程。如果您正在寻找一个内部进程的Web服务器,那么Phusion Passenger并不适合这项工作。 - Hongli

0
如果你正在寻找一种在 Ruby 进程中以简单的方式回答一些 HTTP 查询(例如用于调试),而该进程并非主要是 Web 服务器,那么 WEBrick 在我看来似乎是一个不错的选择。

https://docs.ruby-lang.org/en/2.1.0/WEBrick.html

require 'webrick'

server = WEBrick::HTTPServer.new(Port: 8000)
server.mount_proc '/some_useful_query' do |req, res|
    res.status = 200
    res.body = 'Hello, world!'
end
Thread.new {
    server.start
}

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