zeroexcuses

zeroexcuses

Recommendation for dumb simple http server?

GoLang has a http server built into it’s stdlib.
Elixir has Phoenix/Cowboy.

Suppose I am looking for a dumb simple http server where:

  1. I need it to serve static files
  2. if I need to do any routing, I’ll parse the http URL myself

What is recommended?

I am looking for a minimal http server where it has the basics and I can understand all the features fully.

Most Liked

cmkarlsson

cmkarlsson

I like elli (GitHub - elli-lib/elli: Simple, robust and performant Erlang web server · GitHub) which I’ve used in erlang many times. It is OK to use from elixir as well. In my opinion it is very easy to understand. The implementation is very readable (if you read erlang).

It just does the basics though and you must be prepared to add some middleware or write your own if you need more functionality.

To get started (well, you should read the README.md from their github and follow any links. One of the best things as well is to look in the source for the example callback. I find it is the best place to look to see what is possible):

in mix.exs add {:elli, "~> 3.3.0"} to dependencies.

Write a simple call back module to handle your requests:

defmodule YourApp.ElliHandler do
  @behaviour :elli_handler
  @staticpath "/some/good/path"
  @impl :elli_handler
  @doc """
  The handle/2 function is one of the callbacks.
  It takes the request and returns a response.
  
  It can serve static files via sendfile by just
  returning {:ok, [], {:file, filename}}
  """
  def handle(req, _args) do
    # Split up the method and path and delegate to other functions
    # which uses pattern matching to match on the path. The path
    # is a list of parts of the url split by "/"
    handle(:elli_request.method(req), :elli_request.path(req), req)
  end

  @doc """
  If the paths is /static/<filename>. Serve the file if it exists
  TODO: fix content-type
  """
  defp handle(:'GET', ["static", filename], _req) do
    path = File.join(@staticpath, filename)
    if File.exists(path) do
      {:ok, [], {:file, path}}
    else
      {404, [], "Not Found"}
    end
  end
  defp handle(:'GET', ["dynamic", "user", id], _req) do
    {:ok, [{"Content-Type", "plain/text"}], "User is #{id}"}
  end
  defp handle(_, _, _req) do
    {404, [], "Not Found"}
  end

  @impl :elli_handler
  @doc """
  Will be called during many events of the request cycle. Can be used to hook in to many things
  or not be used at all.
  """
  def handle_event(_event, _data, _args) do
    :ok
  end
end

And hook it up in your supervision tree:

  @impl true
  def start(_type, _args) do
    children = [
      %{
        id: :elli,
        start: {:elli, :start_link, [ [ callback: YourApp.ElliHandler, port: 3000  ]]}
      }
    ]
    opts = [strategy: :one_for_one, name: YourApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
Cochonours

Cochonours

Just an idea, but if you don’t need to do any special processing, wouldn’t using nginx or caddy be more than enough for you?

dorgan

dorgan

The most barebones may be this HTTP server — OTP 29.0.2 (inets 9.7.1)

As for recommended, considering you’re using Elixir, I’d say Plug v1.20.2 — Documentation with GitHub - elixir-plug/plug_cowboy: Plug adapter for the Cowboy web server · GitHub, but that escapes your requirements I’m afraid.

Depends on how much time you want to spend on it and how deep into the rabbit hole you want to go I guess. Unless you want to know how exactly does cowboy work, plug is super simple.

Where Next?

Popular in Discussions Top

WildYorkies
It seems that the more I read, the more I find Elixir users speaking about all the ways that Elixir is not good for x, y, and z use cases...
New
100phlecs
Are there any downsides, like perf issues, to putting all functional components in CoreComponents as long as you prefix it with the conte...
New
crispinb
On reading dhh’s latest The One Person Framework it strikes me that Phoenix with LiveView is already pretty much this. However, never hav...
New
AlexMcConnell
The reason that Rails is as popular as it is is because it’s very easy for relatively inexperienced developers to get a lot of work done....
588 19675 166
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
rms.mrcs
A couple of days ago I was discussing with a friend about different approaches to write microservices. He said that if he was going to w...
New
AstonJ
Can you believe the first professionally published Elixir book was published just 8 years ago? Since then I think we’ve seen more books f...
New
joeerl
I’m playing with Elixir - It’s fun. I think @rvirding does give Elixir courses these days. Re: files and database - when I given Erlang ...
New
kostonstyle
Hi all How can I compare haskell with elixir, included tools, webservices, ect. Thanks
New
Markusxmr
Since Drab has been developed for a while in the open, introducing the Liveview functionality in a way it happend appears to undermine th...
New

Other popular topics Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31194 112
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54250 245
New

We're in Beta

About us Mission Statement