High performance multiple backend web server
Requirements
- Erlang/OTP 19
- Elixir 1.3.4
- Mix 1.3.4
Running
Install elixir and mix:
$ brew install elixirInstall project dependencies with:
$ mix deps.getStart with internal default conf:
$ mix run --no-haltStart with external conf
$ mix escript.build
$ ./ringbahn --config=../some_config_dir/config.ring.jsonFor debugging use iex
iex -S mixWe are at an early development stage, please use it with caution.
Configuration
By default Ringbahn uses json files for configuration.
To distinguish between other json files please prefer using .ring.json extension.
It may use templating support later on… (with EEx or any other choice)
Example configuration is like:
{
"settings": {
"backend": "ZMQ", # Defines the backend interface to talk with handlers
"worker_count": 4, # Defines how many internal processes should be started
"port_offset": 100, # Defines the intervals for instance ports
"disable_access_logging": true # Disables access logging (Not Implemented)
},
"static_dir": { # Static DIR serving (Not implemented)
"base": "public",
"index_file": "index.html",
"default_ctype": "text/plain"
},
"server": {
"pid_file": "/run/ringbahn.pid", # PID file (Not Implemented)
"uuid": "edc0a43a-9d93-4d3d-93db-94c3a581ab17", # Ringbahn Server UUID (will be muxed by worker_count)
"access_log": "/log/access.log", # Access log file basename (Not Implemented)
"error_log": "/log/error.log", # Error log file basename (Not Implemented)
"port": 6767, # Starting port for server endpoint (will be muxed by port_offset)
"default_host": "localhost", # Default host name for serving through...
"hosts": { # Every host declaration goes inside of this
"localhost": [ # Route declarations goes inside of this host
{
"route": "/test", # Route that will be handled
"send_spec": "127.0.0.1", # Send address that will be used to send incoming request to handlers
"send_port": 10000, # Port that will be used for send
"send_ident": "f983c23e-9058-4c9c-56ec-7f9f9a34c9ma",# Identifier for sender server process group
"recv_spec": "127.0.0.1", # Receive address that will be used for receiving responses from handlers
"recv_port": 10001, # Port that will be used for receive
"recv_ident": "t3ok87np-9058-4c9c-9treu-7f9f9a34c9ka"# Identifier for receiver server process group
}
]
}
}
}In depth documentation is available in project page: http://vertexclique.github.io/ringbahn
TODOs
- Regex in urls and globbing
- Make kernel polling if it is available.
- Remove nasty dialyzer errors.
- Declare type specs. [ONGOING]
- Write more tests. [ONGOING]
- Access log, Error log support.
- Pidfile watching, fsevents.
- Implement Protobuf backend.
- Autogen UUID4s.
- Static DIR serving.
Benchmarks
Benchmarks are in benchmark directory. It will be organized when new backends kicked in by time.
Please head to the README of benchmarks for more info.