shithub: docs.9front.org

ref: a01b8642c3fd319efd13a5f90680fab759f627ee
dir: /rc-httpd-werc.md/

View raw version
# Setting up rc-httpd

`rc-httpd` is a web server written in rc and shipped with 9front; It is used to host [9front.org](http://9front.org) and [cat-v.org](http://cat-v.org), among other related websites. It relies on `listen`/`listen1` for network listening, and invokes `/rc/bin/rc-httpd/select-handler` in order to decide how to serve the requested page. For setting up a simple web page:

* Set up `listen` to invoke rc-httpd: on a default 9front instalation (when configured as a cpu server), `listen` looks for unpriviledged services (that run as the user `none`) in `/rc/bin/service`, and priviledged ones (that run as the current user) in `/rc/bin/service.auth`. 9front also ships with a script that invokes `rc-httpd` each connection in `/rc/bin/service/!tcp80`; renaming this file to `tcp80` in the same folder should work for most common cases; check listen(8) for more options and details. `listen1` may also be useful to setup a oneshot server for testing.

* Edit the script `/rc/bin/rc-httpd/select-handler` (you might have to create and `chmod +x` it) to set up the appropriate environment variables and handle the request. At the very least, set up FS_ROOT to point to the root directory of the server, PATH_INFO to the location (relative to `$FS_ROOT`) to be served (usually set to `$location`, which contains the path specified in the request) and `exec` one of the `rc-httpd` default handlers. `$SERVER_NAME` contains the address requested, useful if many websites are being hosted in the same machine. A example `select-handler` is shown below:
	
		#!/bin/rc
		
		PATH_INFO=$location
		
		switch($SERVER_NAME) {
		case example.com
			FS_ROOT=/sys/www/$SERVER_NAME
			exec static-or-index
		
		case *
			error 503
		}
	
	A list of available handlers, along with set/used environment variables and more information about the `select-handler` script is available at rc-httpd(8). `/sys/log/www` may contain useful debugging information, in case things don't work.

Congratulations! You've just got yourself a 100% genuine 9front-hosted webshit, complete with everything one could ever ask for! I'm sorry.

# Werc with rc-httpd

Werc is a minimalist web "anti-framework" written in rc; It powers [9front.org](http://9front.org), [cat-v.org](http://cat-v.org) and other related websites. For using it together with `rc-httpd`:

* Download the most recent tarball from [werc.cat-v.org](http://werc.cat-v.org/) and unpack it somewhere. This guide will use `/sys/www/werc`, replace accordingly.

* Create your website page at `/sys/www/werc/sites/<domain>` and set it up appropriately. This is left as an exercise to the reader.

* In your `/rc/bin/rc-httpd/select-handler`, set the PLAN9 variable to `/` (in order to support plan9port, werc expects PLAN9 to be set to the location where it can find the standard Plan 9 hierarchy and utilities; in Plan 9 (assuming a standard namespace), this is our root folder), make the appropriate arrangements, set FS_ROOT to the werc website path then `exec static-or-cgi <path to werc.rc>` (replace `static-or-cgi` with `cgi` if you don't want `rc-httpd` falling back to serving as static content). An example `select-handler` follows:
	
		#!/bin/rc
		
		PLAN9=/
		PATH_INFO=$location
		
		switch($SERVER_NAME) {
		case example.com
			FS_ROOT=/sys/www/werc/sites/$SERVER_NAME
			exec static-or-cgi /sys/www/werc/bin/werc.rc
		
		case *
			error 503
		}

Congratulations! Your 9front-hosted webshit should now be using werc.