Die Veröffentlichung des Redbean 2.0 Projekts wurde vorgestellt, das einen Webserver bietet, der es ermöglicht, Webanwendungen in Form einer universellen ausführbaren Datei bereitzustellen, die unter Linux, Windows, MacOS, FreeBSD, NetBSD und OpenBSD ausgeführt werden kann. Alle mit der Webanwendung und dem Server verbundenen Ressourcen werden in einer einzigen ausführbaren Datei kombiniert, die mit dem ZIP-Archivformat kompatibel ist und die Verwendung des zip-Utilities zum Hinzufügen zusätzlicher Dateien ermöglicht. Die Fähigkeit, eine Datei auf verschiedenen Betriebssystemen auszuführen und als ZIP-Archiv erkannt zu werden, wird durch Manipulationen mit den Headern der ausführbaren Dateien und das Binden an die plattformübergreifende Standard-C-Bibliothek Cosmopolitan erreicht. Der Code des Projekts wird unter der ISC-Lizenz vertrieben.
Die Idee des Projekts besteht darin, eine ausführbare Datei "redbean.com" mit einem integrierten Webserver bereitzustellen. Der Entwickler der Webanwendung kann mit dem zip-Utility HTML- und Lua-Dateien in diese Datei einfügen und erhält ein eigenständiges Webanwendungs-Paket, das auf allen gängigen Betriebssystemen ausgeführt werden kann, ohne dass ein separater Webserver im System gestartet werden muss.
Nachdem die erhaltene ausführbare Datei gestartet wurde, wird der integrierte Webserver verwendet, um auf die im Datei gespeicherte Webanwendung zuzugreifen. Standardmäßig wird der Handler an localhost angehängt, aber der Server kann auch als regulärer öffentlicher Webserver genutzt werden (zum Beispiel bedient dieser Server die Projekt-Website). Der integrierte Webserver unterstützt den Zugriff über HTTPS und kann mit einer Sandbox-Isolation ausgeführt werden, die es ermöglicht, zu kontrollieren, auf welche System-Schnittstellen zugegriffen wird. Zur Verwaltung des Servers während seiner Ausführung steht eine interaktive REPL-Schnittstelle (basierend auf Lua REPL und der Bestline-Bibliothek, einer Alternative zu GNU Readline) zur Verfügung, die die Möglichkeit bietet, den Zustand des Prozesses interaktiv zu ändern.
Es wird behauptet, dass der Webserver in der Lage ist, mehr als eine Million Anfragen pro Sekunde auf einem normalen PC zu verarbeiten und Inhalte, die mit gzip komprimiert sind, auszugeben. Die hohe Leistung wird dadurch unterstützt, dass zip und gzip ein gemeinsames Format verwenden, sodass die Daten ohne Neuverpackung aus bereits komprimierten Bereichen in der zip-Datei bereitgestellt werden. Darüber hinaus führt der Aufruf der Funktion fork nahezu nicht zu Overhead bei der Platzierung im Speicher, da die ausführbare Datei mit statischer Verlinkung erstellt wurde und eine kleine Größe aufweist.
Neben der Verarbeitung statischer Webinhalte und der Ausführung von JavaScript im Browser kann die Logik von Webanwendungen durch Skripte in der Programmiersprache Lua, des Web-Frameworks Fullmoon und der SQLite-Datenbank erweitert werden. Zu den zusätzlichen Möglichkeiten gehört die Unterstützung des Passwort-Hashing-Schemas argon2, die Möglichkeit zur Bestimmung des IP-Standorts anhand der MaxMind-Datenbank sowie der Zugriff auf die Unix-API der Cosmopolitan-Bibliothek. Die Größe des Basisstapels, der den Webserver, MbedTLS, Cosmopolitan, Lua und SQLite umfasst, beträgt nur 1,9 MB.
Die universelle ausführbare Datei wird durch die Kombination von betriebssystemspezifischen Segmenten und Headern (PE, ELF, MACHO, OPENBSD, ZIP) in einer Datei gebildet. Um die Ausführung einer ausführbaren Datei sowohl in Windows- als auch in Unix-Systemen zu ermöglichen, wird ein Trick angewendet, der darin besteht, Windows PE-Dateien in Form eines Shell-Skripts zu kodieren, wobei zu beachten ist, dass die Thompson-Shell kein Skriptmarker „#!“ verwendet. Infolgedessen wird eine ausführbare Datei erstellt, die mehrere verschiedene Formate kombiniert, die in Linux, BSD, Windows und macOS verwendet werden. $ curl https://redbean.dev/redbean-demo-2.0.7.com >redbean.com $ chmod +x redbean.com $ zip redbean.com hello.html $ zip redbean.com hello.lua $ ./redbean.com -vv I2022-06-23T08:27:14+000767:redbean] (srvr) listen http://127.0.0.1:8080 >: wartet auf Befehl… $ curl https://127.0.0.1:8080/hello.html hello $ printf 'GET /hello.lua\n\n' | nc 127.0.0.1 8080 hello
Quelle: opennet.ru
