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
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:
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.
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 …
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
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
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.
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.
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