Tipps zum Entwickeln eines Webservers

8

Nachdem ich hier ein wenig gesucht habe, habe ich fast keine Fragen zur Entwicklung eines Webservers gefunden.

Ich werde das hauptsächlich aus zwei Gründen tun. Als Nebenprojekt und um mehr über die Entwicklung eines Serverprogramms zu erfahren. Dies wird nicht zu einer brauchbaren Anwendung, sondern eher zu einem Lernwerkzeug

Die Fragen sind also einfach.

  • Haben Sie einen Webserver entwickelt? (egal in welcher Sprache)
  • Was sind die Probleme und andere gute Tipps können Sie
  • liefern

Links zu hilfreichen Seiten sind willkommen, aber verlinken Sie nicht auf ein funktionierendes Projekt, das Open Source ist, da es sich um den Lernprozess handelt.

    
Ólafur Waage 26.01.2012, 07:26
quelle

8 Antworten

16

Ein Webserver beginnt als ein sehr einfaches Stück Code:

  • Öffnen Sie einen TCP / IP-Socket an Port 80
  • während nicht beendet
    • warte auf Verbindungen an diesem Socket
    • wenn jemand Ihnen HTTP-Header sendet
      • finde den Pfad zur Datei
      • Kopieren Sie die Datei in den Socket

So ist der Umriss des Codes einfach.

Nun müssen Sie einige Schwierigkeiten bewältigen:

  • in der einfachsten Version des Codes, während Sie mit einem Browser sprechen, können alle anderen keine Verbindung herstellen. Sie müssen eine Möglichkeit finden, mehrere Verbindungen zu verwalten.
  • Es ist oft praktisch, etwas mehr als nur eine statische Datei senden zu können (obwohl die ersten HTTP-Server genau das getan haben), so dass Sie andere Programme ausführen können.

Die Handhabung von mehreren Verbindungen ist ebenfalls relativ einfach und bietet eine Reihe von Möglichkeiten.

  • Die einfachste Version (wiederum ist das, wie es ursprünglich gemacht wurde) besteht darin, dass der Code, der Port 80 abhört, einen bestimmten Socket für diese Verbindung einrichtet und dann eine Kopie von sich selbst austeilt, um diese eine Verbindung zu verarbeiten. Dieser Prozess wird ausgeführt, bis der Socket geschlossen ist, und wird dann beendet. Das ist jedoch relativ teuer: Eine Gabelung dauert im Allgemeinen einige zehn Millisekunden, so dass die Laufgeschwindigkeit begrenzt ist.
  • Die zweite Möglichkeit besteht darin, einen leichtgewichtigen Prozess zu erstellen - einen / k / a a -Thread - um die Anfrage zu verarbeiten.

Das Ausführen eines Programms ist eigentlich auch ziemlich einfach. Im Allgemeinen definieren Sie einen speziellen Pfad zu einem CGI-Verzeichnis. Eine URL mit einem Pfad durch dieses Verzeichnis interpretiert dann den Pfadnamen als Pfad zu einem Programm. Der Server würde dann mit fork / exec einen Subprozess erstellen, wobei STDOUT mit dem Socket verbunden ist. Das Programm wird ausgeführt, sendet die Ausgabe an STDOUT und es wird an den Client-Browser gesendet.

Dies ist das Grundmuster; Alles andere, was ein Web-Server tut, fügt einfach nur Schnickschnack und zusätzliche Funktionalität zu diesem Grundmuster hinzu.

Hier sind einige andere Quellen für Beispielcode:

Es tut ziemlich viel nichts von dem, was Sie wirklich wollten, aber für einfach ist es schwer zu schlagen dieses von Ссылка :

  

$ python -m SimpleHTTPServer

    
Charlie Martin 16.05.2009, 18:54
quelle
8

Erstens, lasst es nicht zu einem brauchbaren Projekt werden - es ist wirklich schwer, Sicherheitsrechte für Webserver zu bekommen.

Ok, hier sind Dinge zu beachten:

  1. Der Thread, der akzeptiert Verbindungen müssen zu übergeben Hintergrundfäden sobald möglich.
  2. Sie können keinen Thread haben für jede einzelne Verbindung - mit große Mengen, die dir ausgehen Threadgrenze.
  3. Benutze eine Art von a Worker Thread Pool, um Ihre zu behandeln Anfragen.
  4. Stellen Sie sicher, dass Sie scrubben     die URL, wenn Sie ein HTTP GET erhalten     anfordern. Also konnte ich nichts tun     mögen      Ссылка     um Zugriff auf höherer Ebene zu erhalten.
  5. Stellen Sie sicher, dass Sie immer die relevanten Einstellungen vornehmen Inhalt und Mime-Typen.

Viel Glück - das ist ein höllischer Job.

    
rein 16.05.2009 18:34
quelle
1

Die Vernetzung und andere sind ziemlich normal, also mach dir keine Sorgen darüber. (Es gibt mehrere "Instant" -Netzwerkserver in fast allen Sprachen.)

Konzentrieren Sie sich stattdessen auf die tatsächliche Implementierung der HTTP-Spezifikation. Sie werden erstaunt sein über a) was Sie nicht wissen und b) wie viel Dinge, die HTTP-konform sein sollen, wirklich nicht sind, aber täuschen Sie es vor.

Dann werden Sie sich wundern, dass das Web überhaupt funktioniert.

Wenn Sie mit HTTP fertig sind, versuchen Sie, IMAP zu implementieren.

    
Will Hartung 16.05.2009 18:33
quelle
1

Ich habe vor ein paar Jahren einen leichten Webserver in Python geschrieben, auch als Lernprojekt.

Der einfachste Ratschlag, den ich geben kann, insbesondere als Lernprojekt, besteht darin, einen Kern zu erstellen, der funktioniert, und dann einen iterativen Entwurf zu erstellen. Zielen Sie nicht direkt auf den Mond, fangen Sie sehr klein an, fügen Sie Attribute hinzu, verfeinern Sie und machen Sie weiter. Ich würde empfehlen, ein Tool zu verwenden, das Experimente fördert, wie Python, wo Sie Code gleichzeitig eingeben und testen können.

    
Serapth 16.05.2009 18:34
quelle
1

Der Kurs, den ich TAed hatte, hatte einen Proxy-Auftrag, so dass ich hier ein bisschen Licht werfen kann, denke ich.

Ihr werdet also am Ende eine Menge Header-Änderungen vornehmen, um euer Leben einfacher zu machen. Nämlich HTTP / 1.0 ist viel einfacher zu handhaben als HTTP / 1.1. Sie wollen sich nicht mit der Verwaltung von Timeouts und Keep-Alives und solchen Dingen beschäftigen müssen. Eine Verbindung pro Transaktion ist am einfachsten.

Du wirst viel und viel Parsing machen. Das Analysieren ist in C schwierig. Ich würde Ihnen raten, eine Funktion zu schreiben, die so etwas wie

ist %Vor%

und handle es Zeile für Zeile, nur weil es am einfachsten ist, die vorhandenen C-String-Funktionen in jeweils einer Zeile zu verwenden. Denken Sie auch daran, dass Zeilen getrennt sind und Header mit einem \ r \ n \ r \ n enden.

Die Hauptsache wird das Parsen sein, solange Sie Dateien lesen können, alles andere wird wie erwartet funktionieren.

Beim Debuggen werden Sie wahrscheinlich Header ausgeben wollen, die herumgereicht werden, um sie zu testen, wenn etwas kaputt geht.

    
Alex Gartrell 16.05.2009 21:44
quelle
1

local-web-server ist ein Beispiel für einen einfachen Entwicklungs-Webserver, der in node.js geschrieben wurde. Es ist zuverlässiger und hat mehr Funktionen als python -m SimpleHTTPServer

    
Lloyd 08.05.2014 20:55
quelle
0

Ich habe daran gedacht, das gleiche Projekt zu starten, um Python besser zu lernen. Es gibt eine BaseHTTPServer-Klasse , die einen guten Ausgangspunkt darstellt.

Hier sind einige Tutorial-Artikel: 1 & amp; 2

    
Evan Meagher 16.05.2009 18:31
quelle
0

Ich habe bereits einen Webserver entwickelt, der (Html ​​und PHP) in C-Sprache ausführt es ist nicht so kompliziert, dass Sie wissen sollten, wie man TCP / IP Sockets verwendet, Thread um mehrere Anfragen zu bearbeiten, fork (Sie müssen ein Kind für die Ausführung der PHP-Befehlszeile erstellen (ich benutzte execvp))

Ich denke, der streitlustigste Teil behandelt Zeichenfolgen in C-Sprache und sendet POST / GET-Anfragen in der Befehlszeile.

Viel Glück

    
Abdelghani Tassi 03.01.2015 03:26
quelle

Tags und Links