woo

2024-10-12

An asynchronous HTTP server written in Common Lisp

Upstream URL

github.com/fukamachi/woo

Author

Eitaro Fukamachi

License

MIT
README

Woo

CI

Woo is a fast non-blocking HTTP server built on top of libev. Although Woo is written in Common Lisp, it aims to be the fastest web server written in any programming language.

Warning

This software is still BETA quality.

How fast?

Benchmark graph

See benchmark.md for the detail.

Usage

Use clack:clackup or woo:run to start a web server. The first argument is a Lack "app". See Lack's README for instruction on how to build it.

Remember to pass ":debug nil" to turn off the debugger mode on production environments (it's on by default). Otherwise, your server will go down on internal errors.

Start a server

(ql:quickload :woo)

(woo:run
  (lambda (env)
    (declare (ignore env))
    '(200 (:content-type "text/plain") ("Hello, World"))))

Start with Clack

(ql:quickload :clack)

(clack:clackup
  (lambda (env)
    (declare (ignore env))
    '(200 (:content-type "text/plain") ("Hello, World")))
  :server :woo
  :use-default-middlewares nil)

Cluster

(woo:run
  (lambda (env)
    (declare (ignore env))
    '(200 (:content-type "text/plain") ("Hello, World")))
  :worker-num 4)

SSL Support

Use SSL key arguments of woo:run or clack:clackup.

(woo:run app
         :ssl-cert-file #P"path/to/cert.pem"
         :ssl-key-file #P"path/to/key.pem"
         :ssl-key-password "password")

(clack:clackup app
               :ssl-cert-file #P"path/to/cert.pem"
               :ssl-key-file #P"path/to/key.pem"
               :ssl-key-password "password")

To disable the HTTPS support to omit a dependency on CL+SSL, add woo-no-ssl to cl:*features*.

Signal handling

When the master process gets these signals, it kills worker processes and quits afterwards.

  • QUIT: graceful shutdown, waits for all requests are finished.
  • INT/TERM: shutdown immediately.

Benchmarks

See benchmark.md.

Installation

Requirements

  • UNIX (GNU Linux, Mac, *BSD)
  • SBCL
  • libev
  • OpenSSL or LibreSSL (Optional)
    • To turn off SSL, add :woo-no-ssl to cl:*features* before loading Woo.

Installing via Quicklisp

(ql:quickload :woo)

Docker example

See Also

  • Lack: Building a web application
  • Clack: An abstraction layer for web servers
  • libev

Author

Copyright

Copyright (c) 2014 Eitaro Fukamachi & contributors

License

Licensed under the MIT License.

Dependencies (18)

  • alexandria
  • bordeaux-threads
  • cffi
  • clack
  • cl-speedy-queue
  • cl+ssl
  • fast-http
  • fast-io
  • lev
  • quri
  • rove
  • smart-buffer
  • static-vectors
  • swap-bytes
  • trivial-mimes
  • trivial-utf-8
  • uiop
  • vom

Dependents (0)

    • GitHub
    • Quicklisp