evgenyigumnov / cblt

Safe and fast minimalistic web server, written in Rust, that serves files from a directory and proxies requests to another server.
MIT License
39 stars 7 forks source link

СBLT

cblt

Safe and fast minimalistic web server, written in Rust, that serves files from a directory and proxies requests to another server.

Project Name Explanation

The name Cblt appears to be a good shortened version of Cobalt. It retains the association with the element and strength, while also looking modern and minimalist.

Features

Quick Start

You can run Cblt with Cargo or Docker.

Cargo

Install:

cargo install cblt

Run:

cblt

Docker

docker run -d -p 80:80 -p 443:443 --restart unless-stopped --name cblt ievkz/cblt

Volumes:

Test

curl -H "Host: example.com"  http://127.0.0.1/
curl --insecure https:/127.0.0.1/
curl -X POST http://127.0.0.1/api/entry \
-H "User-Agent: curl/7.68.0" \
-H "Accept: */*" \
-H "Content-Type: application/json" \
-d '{"key":"value"}'
curl -v -H "Range: bytes=0-499" http://127.0.0.1/logo.png

"Cbltfile" configuration examples

File server

"*:80" {
    root "*" "/path/to/folder"
    file_server
}

File server & Proxy

"127.0.0.1:8080" {
    reverse_proxy "/test-api/*" "http://10.8.0.3:80"
    root "*" "/path/to/folder"
    file_server
}

TLS support (docs)

"example.com" {
    root "*" "/path/to/folder"
    file_server
    tls "/path/to/your/domain.crt" "/path/to/your/domain.key"
}

Redirect

"*:80" {
    redir "https://127.0.0.1{uri}"
}

Load Balancer

"*:80" {
    reverse_proxy "/http/*" "http://127.0.0.1:8080" "http://127.0.0.1:8081" {
        health_uri "/health"
        health_interval "10s"
        health_timeout "2s"
        lb_policy "round_robin"  //  "ip_hash"
    }
    root "*" "./assets"
    file_server
}

Benchmark

Do test with Apache Benchmark (ab) for 3000 requests with 1000 concurrent connections. Download 23kb image from 127.0.0.1/logo.png

 ab -c 1000 -n 3000 http://127.0.0.1/logo.png
Percent Cblt Nginx
50% 179 1209
75% 194 1655
100% 200 2146

Contributing

I would love to see contributions from the community. If you experience bugs, feel free to open an issue. If you would like to implement a new feature or bug fix, please follow the steps:

  1. Do fork
  2. Do some changes
  3. Create pull request