Search code examples
rubyhttpserver

What option do I have for embedded HTTP/HTTPS server for Ruby app?


I am making some game server. As like any other game server does, I think the server should be state-ful. (might be change later, but currently I am looking for state-ful solution)

After playing with Rake some, I decided to find a solution in Ruby. What I am finding is:

  • An embeddable HTTP server library which can be integrated long-running Ruby app. (in-process lib)
  • Should support handling of bare-bone HTTP request/response handling. No decoration, URL dispatching or web-page template. (which I never need)
  • Should offer hard single-threaded mode.
  • Should support HTTPS with self-signed certificate.
  • Reliable, and proven in production.
  • Nice documentation and large community.

I think most similar example is HTTP server integrated into node.js. Basically a thin layer on top of TCP socket.

It doesn't need to support multi-threading. I think I will run separated process for each CPU core and I need fast development, so multithreading is currently what to evade.

I have looked for Rack, and it seems like just a protocol specification, and is not an actual implementation. And it looks like for state-less web-app only. If it is not,please correct me.

So, what kind of options are available for these stuffs in Ruby?


Solution

  • In general if you want to know "What are my options in Ruby regarding [...]" your best resource is The Ruby Toolbox.

    The web servers category shows many options. The most popular servers are:

    • Thin
    • Passenger (can be used standalone or with Apache Web Server)
    • Unicorn
    • Mongrel

    A few notes on your requirements:

    • It helps if think "The web server embeds my application" rather than "I'll embed the server into my application".
    • In production you'll always need multiple instances of your application, because most Ruby web servers work that way. (Because multithreading in Ruby and its implementations is a tough subject)

    Personally I'm using both Thin and Passenger with great success. The combination "Thin during development, Passenger in production" seems to very common, too.

    PS: You are not mentioning any web framework. Even if you want to make your application as lightweight as possible, a simple web framework can spare you a lot of boilerplate code. (The Ruby Toolbox: Web App Frameworks)