When the httpd runs it sets itself to user "none" and runs newns(2) and then addns(2) using the namespace provided on the command line (or /lib/namespace.httpd if you didn't give it a -n). This means that whatever you supply for the namespace file has to exist in the new namespace. ip/httpd/httpd -n /cfg/$sysname/namespace.httpd was my solution.
While experimenting I had the problem of how to kill a process owned by none, here's how to do it :
p = `{ps | grep httpd} chmod 777 /proc/$p(2) ^/note && echo kill > /proc/$p(2) ^/note
I'm assuming only one program called httpd is running, of course.
For extra fun ip/httpd/mirror was missing from my distribution (Sept 07) and I didn't notice for ages.
momo here is a Unix box running u9fs -a none and I'm using a terminal to play on so termrc it is
cat /cfg/$sysname/termrc
fn start_httpd { rfork bind /n/momo/home/plan9/httpd /usr bind /usr/httpd.rewrite /sys/lib/httpd.rewrite ip/httpd/httpd -n /cfg/$sysname/namespace.httpd } 9fs momo start_httpd &
The folder /n/momo/home/plan9/httpd has in it :
bin/ web/ httpd.rewrite
cat /cfg/$sysname/namespace.httpd
mount /srv/momo /n/momo bind /n/momo/home/plan9/httpd/bin /bin/ip/httpd
So now my /magic/ files are kept on momo so I don't pollute /bin/ip/httpd
I also found a bug with vhosts and submitted a patch(1) httpd-post-port because vhosts running on non-default port were impossible as the :port was being stripped when the vhosts were parsed but not when matching http requests. Leaving the :port on is the correct behaviour according to RFC 2616 14.23.