[linux-l] Winziger Webserver: Eine Seite, nur Localhost

Volker Grabsch vog at notjusthosting.com
Mi Jun 7 10:02:08 CEST 2006


On Tue, Jun 06, 2006 at 09:54:05PM +0200, Nico Golde wrote:
> Noch nicht auf deine Bedürfnisse angepasst, aber ich hab für eine Seite 
> bisher immer folgendes gemacht:
> while `netcat -lp 80 -c 'echo -e "HTTP/1.0 200 OK\n"; echo \`cat index.html\`'`; do echo got connection; done

Ist das nicht ein wenig umständlich? Wieso

    echo `cat index.html`

statt einfach "cat index.html"?
Außerdem fehlt die "Content-type"-Zeile.

Wie wäre es hiermit:

    while `netcat -lp 80 -c 'echo -e "HTTP/1.0 200 OK\nContent-Type: text/html\n"; cat index.html'`
        echo got connection
    done

Dies kommt natürlich noch nicht an den Inetd heran, der mehrere
gleichzeitige Anfragen beherrscht, statt den Port 80 einfach
freizugeben, während der antwortet. :-)

Du schreibst z.B. ein Shellscript /root/meinserver.sh:

    #!/bin/sh

    echo "HTTP/1.0 200 OK"
    echo "Content-type: text/html"
    echo
    cat /root/index.html


In die /etc/inetd.conf trägst du ein:

    80  stream  tcp  nowait  root  /root/meinserver.sh

Statt 80 kannst du auch einen anderen Port oder "http" eintragen.
Statt "root" trägst du den User ein, unter dessen Rechte das Script
laufen soll. Statt /root/meinserver.sh trägst du dein Script ein. Ist
es ein PHP-Script, musst du den PHP-Interpreter noch laden.


Dein PHP-Script sähe dann etwa so aus (meinserver.php):

------------------------------------------------------
HTTP/1.0 200 OK
Content-type: text/html

<html>
<?
echo "1+1 = " . (1+1);
?>
</html>
------------------------------------------------------

Das heißt, diese ersten 3 Zeilen (HTTP-Antwort, Content-Type,
Leerzeile) kommen oben hinzu.

Nehmen wir an, du hast einen User "dienst", in dessen Homeverzeichnis
das PHP-Script liegt, dann trägst du in die inetd.conf ein:

------------------------------------------------------
http  stream  tcp  nowait  dienst  /usr/bin/php /home/dienst/meinserver.php
------------------------------------------------------

Das war's schon. 3 Zeilen in dein Script reinhauen, eine Zeile in
die inetd.conf, fertig.


Brauchst du mehr (z.B. Unterseiten, CGI-Parameter, etc.), dann
nimm fnord.

Brauchst du noch mehr (unwahrscheinlich), verwende eine HTTP-Bibliothek
und dass dein Programm als eigenen Dienst laufen.

Aber bitte, bitte kein eigenes Gefrickel mit socket() und Co., auf
diesem Level braucht man heutzutage nicht mehr programmieren, es sei
denn, man muss Performance rauskitzeln oder man implementiert ein
völlig neues Protokoll. (selbst beim neuen Protokoll würde ich lieber
z.B. Twisted nehmen, statt die Sockets per Hand zu öffnen und auszulesen)

Für primitive Anwendungen gibt's netcat/inetd/xinetd, da ist Handarbeit
nur Overkill. Und für alles komplexere gibt's highlevel Bibliotheken
und Webserver, da will man socket() & Co. also auch nicht verwenden. :-)


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l