tipidee
Software
skarnet.org

A tipidee quickstart guide

Preparation

  1. Make sure you have s6 and s6-networking installed alongside tipidee.
  2. Prepare your document root for every virtual domain you aim to serve. For instance, if your documents are in /home/www/docs and you need to serve the example.com and example.org domains, create /home/www/docs/example.com and /home/www/docs/example.org directories, they will be the document roots for the example.com and example.org virtual sites respectively.
  3. Symlink these canonical directories to all the host:port combinations you want them to be available on. If you want example.com and example.org to be both available on ports 80 and 443, then symlink example.com to example.com:80 and example.com:443 in the /home/www/docs directory, and do the same with example.org.
  4. Compile a default configuration for tipidee: :> /etc/tipidee.conf && tipidee-config.

Running the server

tipidee service templates

The tipidee source distribution comes with an examples/ subdirectory containing service files to run tipidee under various service managers.

Caveats

Host support in HTTP/1.0

A strict reading of the HTTP/1.0 specification says that the Request-Line is the only piece of client-provided data that can be used to identify a resource, and that extension headers can modify the interpretation and processing of that resource but not change what resource is served.

This goes directly against the use of the Host header to identify the host of a resource and that is used in HTTP/1.1.

A lot of HTTP servers out there don't really care about that, and have historically used Host to perform virtual hosting even in HTTP/1.0, even though it goes against the specification. Consequently, clients have adapted, and even the popular curl client sends a Host header in HTTP/1.0.

Since the point of the Web is interoperability, tipidee aligns with the common practice, and will read a client-provided Host header, if any, to determine what domain the request is directed to, even in HTTP/1.0 though it is contrary to the specification. I refer to this practice as "HTTP/1.05".

Frequently asked questions

I want my web server to listen to more than one address. Do I need to do all that for every address I have?

Not necessarily: you could listen to 0.0.0.0 for IPv4, and :: for IPv6. But if you don't want your server to listen to all the addresses on your machine, then yes, you will have to run one process per address:port tuple.

It's okay though: every listening process is very small. The skarnet.org server has two network cards and runs a web server on both of them, on IPv4 and IPv6, over HTTP and HTTPS, which makes 8 services. Plus one s6-log logger process for each of these services. Plus a supervisor for every service and every logger — for a whooping total of 64 long-running processes just for its web server functionality; and it's still not even noticeable, the amount of resources it consumes is negligible. So, don't worry about it; all your resources are still available for the serving itself.

Note that this allows you to run different instances of tipideed, on different sockets, with different configurations, if you need it. Use the -f option to specify a different config file in your instances.