ref: 546a16941ce239542c5de207ac3351a53708c331
dir: /rc-httpd-werc.md/
# 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.