Hochleistungs-Anwendungs-Webserver in C/C++

Lesezeit: 9 Minuten

Gibt es einen Hochleistungs-Webserver (idealerweise Evented und Open Source) in C oder C++?

Ich möchte es verwenden können, indem es eine Methode/Funktion in meiner Anwendung mit einer ausgefüllten HTTP-Anforderungsklasse/-struktur aufruft, und dann kann ich eine ausgefüllte HTTP-Antwortklasse/-struktur zurückgeben.

Wenn es sich nicht um Open Source handelt, brauche ich eine integrierte Unterstützung für Long-Polling-Verbindungen, Keep-Alive usw. Andernfalls denke ich, dass ich diese Dinge selbst hinzufügen kann.

Wenn Sie keinen solchen verfügbaren Server kennen, würden Sie empfehlen, einen eigenen Webserver zu schreiben, um die Aufgabe zu erfüllen? Es kann nicht dateibasiert und in leistungsfähigem C/C++ geschrieben sein.


Bearbeiten: Ich denke so etwas wie den Ruby Mongrel für C, wenn das hilft.

  • ajax: fastcgi++. websockets: websocket++

    Benutzer1382306

    4. August 2013 um 3:14 Uhr

  • Ich denke, was Sie suchen, ist eine HTTP-Serverbibliothek, kein eigenständiger Server.

    – haneefmubarak

    15. Dezember 2014 um 2:37 Uhr

Benutzeravatar von Yaroslav Stavnichiy
Jaroslaw Stavnichiy

Ich hatte die gleichen Anforderungen für meinen Job, also habe ich eine Reihe von Lösungen evaluiert: Mongoose, libmicrohttpd, libevent. Und ich habe auch darüber nachgedacht, Nginx-Module zu schreiben. Hier die Zusammenfassung meiner Erkenntnisse:

nginx

nginx-Projektseite

Ich liebe diesen Server und benutze ihn viel. Seine Leistung und Ressourcennutzung ist viel besser als die von Apache, den ich auch immer noch verwende, aber eine Migration zu nginx plane.

  • Sehr gute abstimmbare Leistung. Reichhaltige Funktionalität. Portabilität.
  • Die Modul-API ist nicht dokumentiert und scheint sehr ausführlich zu sein. Sieh dir das an nginx Hallo-Welt-Modul zum Beispiel.
  • Nginx verwendet keine Threads, sondern mehrere Prozesse. Dies erschwert das Schreiben von Modulen, das Erlernen der nginx-API für gemeinsam genutzten Speicher usw.

Mungo

Mongoose-Projektseite

  • Der gesamte Code des Servers befindet sich in einer einzigen mongoose.c-Datei (ca. 130 KB), keine Abhängigkeiten. Das ist gut.
  • Ein Thread pro Verbindung. Wenn Sie also Parallelität benötigen, müssen Sie viele Threads konfigurieren, dh. hohe RAM-Auslastung. Nicht so gut.
  • Die Leistung ist gut, wenn auch nicht außergewöhnlich.
  • Die API ist einfach, aber Sie müssen alle Antwort-HTTP-Header selbst zusammenstellen, dh. Lernen Sie das HTTP-Protokoll im Detail.

libmicrohttpd

libmicrohttpd-Projektseite

  • Offizielles GNU-Projekt.
  • Die ausführliche API erscheint mir umständlich, obwohl sie viel einfacher ist, als Nginx-Module zu schreiben.
  • Gute Leistung im Keep-Alive-Modus (Link zu meinen Benchmarks unten), nicht so gut ohne Keep-Alive.

libevent

libevent-Projektseite

Die Libevent-Bibliothek verfügt über einen integrierten Webserver namens evhttp.

  • Es ist ereignisbasiert, verwendet dafür libevent.
  • Einfache API. Erstellt HTTP-Header automatisch.
  • Offiziell Singlethread. Dies ist ein großer Nachteil. Ich habe gefunden ein hack, wodurch mehrere Instanzen von evhttp gleichzeitig ausgeführt werden und Verbindungen vom selben Socket akzeptieren. Ich bin mir nicht sicher, ob alles sicher und robust ist.
  • Die Leistung von Single-Threaded evhttp ist überraschend schlecht. Multi-Threaded-Hack funktioniert besser, aber immer noch nicht gut.

G-WAN

G-WAN-Projekt ist nicht Open Source, aber ich möchte ein paar Worte dazu sagen.

  • Sehr gute Performance, geringer Speicherverbrauch, 150 KB ausführbar.
  • Sehr bequeme ‘Servlet’-Bereitstellung: Kopieren Sie einfach die .c-Datei in das csp-Verzeichnis, und der laufende Server kompiliert sie automatisch. Code-Änderungen auch on the fly kompiliert.
  • Einfache API. Obwohl in gewisser Weise eingeschränkt. Umfangreiche Funktionalität (json, Key-Value Store usw.).
  • Instabil. Ich hatte Segfaults bei statischen Dateien. Hängt an einigen Beispielskripten. (Erfahren bei einer sauberen Installation. Nie gemischte Dateien verschiedener Versionen).
  • Nur 32-Bit-Binär (nicht mehr).

Wie Sie also sehen können, hat mich keine der bestehenden Alternativen vollständig zufrieden gestellt. Also habe ich einen eigenen Server entwickelt, der …

NXWEB

NXWEB-Projektseite

Feature-Highlights:

  • Sehr gute Leistung; siehe Benchmarks auf der Projektseite
  • Kann Zehntausende gleichzeitige Anfragen bedienen
  • Geringer Speicherbedarf
  • Skalierbares Multithread-Modell
  • Außergewöhnlich leichte Codebasis
  • Einfache API
  • Ordentliche Handhabung des HTTP-Protokolls
  • Keep-Alive-Verbindungen
  • SSL-Unterstützung (über GNUTLS)
  • HTTP-Proxy (mit Keep-Alive-Verbindungspooling)
  • Nicht blockierende Sendfile-Unterstützung (mit konfigurierbarem Speichercache für kleine Dateien; gzip-vorcodierte Dateibereitstellung)
  • Modulares Design für Entwickler
  • Kann als Daemon ausgeführt werden; startet sich bei einem Fehler neu
  • Open Source

Einschränkungen:

  • Hängt von der libev-Bibliothek ab (nicht mehr)
  • Nur unter Linux getestet

  • Die NXWeb-Benchmarks sind nicht sehr streng: Ein Footprint von 105 MB RAM für G-WAN? (das habe ich in 3 Jahren noch nie gesehen) NXWeb profitiert von Anforderungsbereichen, während andere nur einen Wert haben? Versuchen Sie, anstelle einer One-Shot-Parallelität einen Parallelitätsbereich von 1–1000 zu verwenden, um Ihre Tests relevanter zu machen. Und wenn Sie sagen, dass andere abstürzen oder nicht stabil sind, im Ernst, wenn Ihr Projekt gut ist, muss es sich nicht in diese Art von Niedrigkeit wagen.

    – Gil

    12. April 2012 um 18:01 Uhr


  • Hier sind die Diagramme: gwan.com/imgs/nxweb_3.0.1_100k.png vs gwan.com/imgs/localhost_gwan2.10.8.png und der Gewinner ist … G-WAN (für Geschwindigkeit, CPU und RAM) – nicht nxWeb, wie oben beworben. Yaroslav, hier ist der Quellcode des Tests: gwan.com/source/ab.c, ich respektiere Ihre Arbeit, machen Sie dasselbe mit G-WAN. Es gibt noch Raum für Verbesserungen in nxWEB, um die Leistung von G-WAN zu erreichen.

    – Gil

    12. April 2012 um 20:58 Uhr

  • Bezüglich Benchmarks: Ich denke, das ist nicht der richtige Ort, um darüber zu diskutieren. Ich habe in diesem Beitrag nicht gesagt, dass nxweb schneller als g-wan ist, daher scheint Ihr Argument irrelevant zu sein. Ich schlage vor, hier zu diskutieren: groups.google.com/forum/?hl=de&fromgroups#!topic/nxweb/…

    – Jaroslaw Stavnichiy

    18. April 2012 um 12:48 Uhr

  • In Bezug auf die Thread-Sicherheit von nxweb: Könnten Sie bitte einen Fehlerbericht an den Issue-Tracker senden. Im Allgemeinen liegt die Thread-Sicherheit des Modulcodes in der Verantwortung des Moduls. Und wieder ist dies nicht der richtige Ort, um darüber zu diskutieren.

    – Jaroslaw Stavnichiy

    18. April 2012 um 12:54 Uhr

  • Es ist der “richtige Ort” für Sie, zu behaupten, andere seien “nicht stabil”, aber Sie möchten nicht, dass die Angelegenheit für NxWeb diskutiert wird … das mit weighttp -n 100000 -c auf die Knie fällt (683 req/s). 1000 -t 6 -k -H “Akzeptiere-Codierung: gzip” “127.0.0.1:80/…„Und erspar uns das “modules is not thread-safe” Lied: Das ist der Code (gwan.com/source/loan.c), das G-WAN mit dem obigen weighttp-Befehl mit 110.000 req/s bedient. Ich bin Teil der Entwicklung von G-WAN – Sie haben keinen G-WAN-Fehlerbericht ausgefüllt, um Ihre Behauptung “Instabilität” zu untermauern. Verwenden Sie Loan.c, Sie werden sehen.

    – Gil

    18. April 2012 um 18:38 Uhr

Ich würde vorschlagen, eine ausführbare FastCGI-Datei zu schreiben, die mit vielen Hochleistungs-Webservern (sogar Closed-Source-Servern) verwendet werden kann.

  • Eine Sache, die ich an FastCGI nicht mag, ist, dass Sie am Ende zwei Sockets pro einfacher HTTP-Anforderung benötigen, und oft werden das bei einer DB-Verbindung 3.

    – Aaron Yodaiken

    20. Juni 2011 um 16:23 Uhr

  • Sind IPC-Sockel wirklich ein Problem bei der Skalierbarkeit? Ich glaube nicht. Der TCP/IP-Stack wird dafür nicht verwendet.

    – Axel Gneiting

    20. Juni 2011 um 16:36 Uhr


  • … und wenn Sie Ihre Ressourcen effektiv verwalten (wie es FastCGI kann), müssen Sie die Backend-Sockets nicht für jede Anfrage öffnen/schließen.

    – Symbohne

    21. Juni 2011 um 9:52 Uhr

Benutzeravatar von Gabe Rainbow
Gab Regenbogen

Mungo: eine Datei. einfach und leicht zu bedienen. kein asycn io, aber perfekt für eingebettete und spezielle zwecke.

gwan. Ausgezeichnet. keine Abstürze. ultra gut geplante Konfiguration. sehr intelligent und einfach für die c/c++-Entwicklung, mit anderen Worten, sehr saubere, vernünftige api im Vergleich zu nginx. bietet einen Thread pro Kern. oder was auch immer Sie angeben. eine tolle Wahl. Größter Nachteil (vielleicht fehlt mir in diesem Bereich): Code kann nicht durchlaufen werden.

libevent: Single-Thread ist auf einem Single-Core-Rechner kein Nachteil. schließlich ist sein Punkt ein asynchroner I/O. hat Multithreads für andere Kerne.

nginx: keine persönliche Erfahrung. auf einem lückenhaften Server ernsthaft an Boden gewinnen. (schrecklich verwirrende API)

boost asio: eine C++-Bibliothek für Asynchio (Asio). fantastisch. braucht eine freundliche API auf höherer Ebene für Einfaltspinsel wie mich. und andere, die von PHP, Java, Javascript, node.js und anderen Websprachen kommen.

Python-Flasche: Tolle 1-Datei-Lib (Framework/System), die es einfach macht, Python-Web-Apps zu erstellen. hat/ist ein eingebauter httpd-Server, wie libevent und node.js

node.js: Javascript-Asyncio-Server. eine hervorragende Auswahl. Leider müssen Sie in Javascript programmieren, das wird mühsam. während es etwas zu sagen gibt, um die Arbeit zu erledigen; es gibt auch etwas zu sagen, um sich während des Prozesses zu amüsieren. hoffentlich kommt niemand mit node.php

  • Sehen Sie sich libuv und http-parser an, die C-Bibliothek für node.js.

    – pcunite

    22. August 2013 um 8:08 Uhr

  • Schauen Sie sich Civetweb an, eine vom MIT lizenzierte Version von Mongoose.

    – gbjbaanb

    24. März 2014 um 10:08 Uhr

Benutzeravatar von symcbean
Symbohne

Ich werde dasselbe vorschlagen wie Axel Gneiting – habe aber eine Antwort mit meinen Gründen für diesen Ansatz geliefert:

1) HTTP ist als Protokoll nicht trivial – das Schreiben eines eigenen Servers oder das Ändern einer Standardlösung ist eine sehr komplexe Aufgabe – viel komplexer als die Verwendung der verfügbaren APIs zur Implementierung einer separaten Verarbeitungs-Engine

2) Die Verwendung eines (unmodifizierten) Mainstream-Webservers sollte Ihnen mehr Funktionalität bieten, als Sie benötigen (so dass Sie Platz zum Wachsen haben).

3) Die Verwendung eines (unmodifizierten) Mainstream-Webservers bedeutet normalerweise, dass er weitaus umfassender getestet und dokumentiert wurde als ein Homebrew-System.

4) .. und es ist wahrscheinlicher, dass es sicher und stabil ist.

5) Mit fastCGI können Sie alle Arten von Sprachen verwenden, um Ihre Back-End-Verarbeitung in zu entwickeln – einschließlich C++ und C. Es gibt Standard-Toolkits zur Verfügung, um dies zu erleichtern.

6) Alternativ bieten viele Webserver Unterstützung für das Ausführen von Interpreter-Engines im Prozess (z. B. mod_php, mod_perl). Ich würde jedoch davon abraten, Ihren eigenen nativen Code als Modul auszuführen.

Es kann nicht dateibasiert sein.

Eh? Was bedeutet das?

Ich bin ein begeisterter nginx Benutzer; nginx ist in C geschrieben; nginx scheint, als könnte es für Sie funktionieren. Wenn Sie die allerbeste Geschwindigkeit aus Nginx herausholen möchten, würde ich ein Nginx-Modul erstellen. Hier sind Module von Drittanbietern die Sie untersuchen können, um eine Vorstellung davon zu bekommen, was es erfordert.

Was die langen Abfrageanforderungen betrifft, sollten Sie sich die HTTP-Push-Module ansehen.

  • Wie oft kommt die nginx Modul-API-Änderung? (Es scheint sich mindestens einmal geändert zu haben, seit der Hauptleitfaden geschrieben wurde.)

    – Aaron Yodaiken

    20. Juni 2011 um 20:24 Uhr

  • Obwohl ich keine Module selbst schreiben musste, sollte das Modul api meines Wissens ziemlich stabil sein. Wenn es Änderungen gibt, bezweifle ich, dass der Autor ohne triftigen Grund bahnbrechende Änderungen vornehmen würde.

    – pcting

    21. Juni 2011 um 0:36 Uhr

  • Dies ist ein schöner Einblick in die Entwicklung von Nginx-Modulen: evanmiller.org/nginx-modules-guide.html

    – pcting

    21. Juni 2011 um 0:37 Uhr

  • Wie oft kommt die nginx Modul-API-Änderung? (Es scheint sich mindestens einmal geändert zu haben, seit der Hauptleitfaden geschrieben wurde.)

    – Aaron Yodaiken

    20. Juni 2011 um 20:24 Uhr

  • Obwohl ich keine Module selbst schreiben musste, sollte das Modul api meines Wissens ziemlich stabil sein. Wenn es Änderungen gibt, bezweifle ich, dass der Autor ohne triftigen Grund bahnbrechende Änderungen vornehmen würde.

    – pcting

    21. Juni 2011 um 0:36 Uhr

  • Dies ist ein schöner Einblick in die Entwicklung von Nginx-Modulen: evanmiller.org/nginx-modules-guide.html

    – pcting

    21. Juni 2011 um 0:37 Uhr

1402370cookie-checkHochleistungs-Anwendungs-Webserver in C/C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy