djb publicfile httpd einrichten

reinhard@finalmedia.de Sat 13 Nov 2021 12:26:47 PM CET

# publicfile ist ein minimalistischer, stabiler, sicherer und sehr performanter oldschool HTTP Server von D.J. Bernstein (djb). Diese Anleitung beschreibt, wie publicfile zusammen mit daemontools auf einem debian host einzurichten ist.

Wir bauen gegen die musl-libc, um leichtgewichtigere Binaries zu erhalten.

Quellcode beziehen und Executables bauen

Zunächst brauchst du den Original Quellcode https://cr.yp.to/publicfile/publicfile-0.52.tar.gz von djb in public domain veröffentlicht.

Oder hier als Mirror zum direkten Download: publicfile-0.52.tar.gz

Folgende sha256sum solltest du prüfen:

3f9fcf737bfe48910812cc357a31bf1f2e3da2490dbd175ce535830f251c08ef  publicfile-0.52.tar.gz

Wir bauen jetzt die Executables aus den Originalquellen auf deiner Workstation und ich nehme an, dass der httpd auch dort mit daemontools an den Start gehen soll:



apt-get install daemontools daemontools-run
systemctl enable daemontools

# ucspi-tcp installieren (djb)
# hier ist erklärt, was das ist https://cr.yp.to/ucspi-tcp.html
apt-get install ucspi-tcp

# quellverzeichnis erstellen, quellen herunterladen und dorthin entpacken
mkdir -p ~/src/publicfile/
curl https://cr.yp.to/publicfile/publicfile-0.52.tar.gz | tar -C ~/src/publicfile/ -x -v -z

# build konfiguration vornehmen
cd ~/src/publicfile
echo "musl-gcc -O2 -include /usr/include/x86_64-linux-musl/errno.h -static" > conf-cc
echo "musl-gcc -s -static" > conf-ld

# build
apt-get install musl-dev musl-tools musl make
make

# copy binary
mkdir /srv/publicfile
mkdir /srv/publicfile/log
cp httpd /srv/publicfile/httpd

# runfile erstellen
cat << :::eof::: > /srv/publicfile/run && chmod +x /srv/publicfile/run
#!/bin/sh
test -d /public || exit 1
cd /public || exit 1
exec 2>&1
# mit drop auf id 65534 (user nobody)
exec tcpserver -u 65534 -c 10000 -R -H 0 80 unshare -r -n /srv/publicfile/httpd
# alternativ an port 8080 binden und dabei auch tcpserver bereits limitiert aufrufen
#exec setuidgid nobody tcpserver -c 10000 -R -H 0 8080 unshare -r -n /srv/publicfile/httpd
:::eof:::

# runfile fuer log
cat << :::eof::: > /srv/publicfile/log/run && chmod +x /srv/publicfile/log/run
#!/bin/sh
exec 2>&1
exec setuidgid nobody unshare -r -n multilog t s10485760 n100 ./main
:::eof:::


# datenverzeichnis erstellen
mkdir /public
mkdir /public/127.0.0.1

# democontent
date > /public/127.0.0.1/index.html
chmod +rx /public
chmod +rx /public/127.0.0.1

# daemon an den start bringen
ln -s /srv/publicfile /etc/service


binary

httpd.gz
bb197d2e625ba6bdd5a889a84835a087f008c8ed433ce1e4e909349336b0ee0a  httpd.gz