unit-rs 0.1.0

A safe wrapper around Nginx Unit's libunit.
docs.rs failed to build unit-rs-0.1.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: unit-rs-0.2.0

unit-rs

unit-rs is a safe wrapper around the libunit C library from Nginx Unit which allows creating Unit applications in Rust.

Currently very few features are supported, but enough are available to inspect all aspects of a request and create a response.

Example

Add unit-rs as a dependency:

[dependencies]
unit-rs = "0.1"

And add the following to src/main.rs:

use unit_rs::Unit;

fn main() {
    let mut unit = Unit::new();

    unit.set_request_handler(|req| {
        let headers = &[("Content-Type", "text/plain")];
        let body = "Hello world!\n";
        req.create_response(headers, body)?;
    
        Ok(())
    });

    unit.run();
}

Once compiled, a running Nginx Unit server can be configured to use it with an external application pointing to the binary's path:

{
  "listeners": {
      "*:8080": {
          "pass": "applications/rustapp"
      }
  },
  "applications": {
      "rustapp": {
          "type": "external",
          "working_directory": "/path/to/package",
          "executable": "/path/to/package/hello_world",
          "processes": 4,
      }
  }
}

See the examples/request_info.rs example for a more in-depth example, and the deploy.sh script for an example curl command.

Building

In order to build, the library requires libclang (needed by bindgen) and unit-dev (which provides libunit.a and its headers).

Most distributions will have a libclang-dev package (or similar), while unit-dev must be installed from Unit's own repositories linked in their installation guide.

Note that Nginx Unit requires the server and applicaton to have the same version; an application compiled with a libunit from an older or newer version of Nginx Unit will not work.

Benchmarks

A test on a Ryzen 7 CPU with the wrk benchmarking tool shows Unit reaching ~250000 requests per second, mostly maxing out on the Unit server and the wrk tool itself.

For comparison, a classic Nginx server serving static files reached ~200000 requests per second (although note that the classic Nginx has significantly more features).