Inhaltsverzeichnis:
- Handbuch und Beispiele
- Installation und FAQ
- Funktionen und Benchmarks
- Über, Urheberrechts- und Lizenzierung, SBOM und Referenzen
- Chatten Sie über Discord, besprechen Sie Github oder E -Mail -Autor
kawipiko
ist ein leichter statischer HTTP -Server, der in Go geschrieben wurde. konzentrierte sich darauf, statische Inhalte so schnell und effizient wie möglich zu bedienen, mit der niedrigsten Latenz und mit dem niedrigsten Ressourcenverbrauch (entweder CPU, RAM, IO); Unterstützung sowohl HTTP/1 (mit oder ohne TLS), HTTP/2 und HTTP/3 (über Quic) ; Verfügbar als einzelne statisch verknüpfte ausführbare Datei ohne andere Abhängigkeiten.
Möchten Sie kawipiko
in Aktion sehen?
/documentation
repräsentiert statische Stellen, die gut komprimieren, inzwischen /carina-nebula
, /openstreetmap
und /fontawesome
repräsentiert statische Stellen, die viele kleine Anfragen erzeugen; (Bitte beachten Sie, dass diese Instanz hinter CloudFlare liegt, es wurde jedoch angewiesen, nichts am Rande zu speichern;) (Der Server wird derzeit über eine Faserverbindung in Wohngebieten gehostet;) Simple bedeutet jedoch nicht dumm oder begrenzt , stattdessen impliziert es effizient durch die Entfernung überflüssiger Merkmale, wodurch die alte Philosophie von UNIX "eins zu tun und gut tun" eintritt. Daher unterstützt es nur GET
und bietet keine Funktionen wie dynamische Inhaltsgenerierung, Authentifizierung, Reverse -Proxying usw.; Inzwischen immer noch Komprimierung ( gzip
, zopfli
oder brotli
) sowie HTML-CSS-JS Miniding (TODO), ohne die Leistung zu beeinflussen (aufgrund seiner einzigartigen Architektur wie unten beschrieben).
Was kawipiko
bietet open-read-close
etwas sehr Einzigartiges, das kein anderer HTTP-Server anbietet: Der statische Inhalt wird aus einer CDB open-read-close
Systeme). Darüber hinaus kann der statische Inhalt, wie bereits erwähnt, immer noch im Voraus komprimiert oder abgebrochen werden, wodurch nicht nur die CPU, sondern auch die Bandbreite und Latenz verringert werden.
CDB-Dateien sind Binärdatenbankdateien, die effiziente schreibgeschützte Schlüsselwert-Such-Tabellen anbieten, die ursprünglich in einigen DNS- und SMTP-Servern verwendet werden, hauptsächlich für die Suchvorgänge mit niedrigem Overhead-Suchvorgängen, keine Szenarien mit Multi-Threadede / Multi-Process-Szenarien und "Atomic "Multi-Rekord-Updates. Dies macht sie auch für statische Inhalte mit niedrigem Latenz für HTTP geeignet, was dieses Projekt bietet.
Für diejenigen, die mit Netlify (oder Wettbewerbern wie Cloudflare-Seiten, Github-Seiten usw.) vertraut sind, ist kawipiko
eine Alternative zur Selbstversicherung :
chroot
oder es heutzutage so in Mode konstruieren;)Eine vollständige Liste der Funktionen finden Sie in den Features -Abschnitt. Leider gibt es auch einige Kompromisse wie im Abschnitt Grenzen beschrieben (obwohl keine kritisch ist).
In Bezug auf die Leistung ist kawipiko
, wie im Benchmarks-Abschnitt beschrieben, mindestens mit Nginx auf Par, wobei über 100.000 Anfragen pro Sekunde mit einer Latenz von 0,25 ms für 99% der Anfragen selbst bei meinem 6-jährigen Laptop eine Latenz von 0,25 ms aufrechterhalten wird. Der Hauptvorteil gegenüber NGINX ist jedoch keine Rohleistung, sondern die Einfachheit der Bereitstellung und Konfiguration sowie eine effiziente Verwaltung und Speicherung großer Sammlungen vieler kleiner Dateien.
In Bezug auf kawipiko
habe ich auch einige Artikel auf meiner eigenen Website veröffentlicht:
seccomp
-Syscall -Filterung von Linux verwendet habe, um die Sicherheit zu verbessern, indem die Angriffsfläche reduziert wird.kawipiko
;)Das Projekt enthält die folgenden ausführbaren Ausführbarungen (statisch verknüpft, ohne andere Abhängigkeiten):
kawipiko-server
-der den statischen Inhalt aus dem CDB-Archiv entweder über http (mit oder ohne TLS), http/2 oder http/3 (über Quic) dient;kawipiko-archiver
-das das CDB-Archiv aus einem Quellordner erstellt, der den statischen Inhalt enthält und förmlich komprimiert und miniierende Dateien minimiert.kawipiko
-Eine ausführbare All-in-One-ausführbare Datei, die alle Funktionen in einer ausführbaren Datei enthält; (dh kawipiko server ...
oder kawipiko archiver ...
); Im Gegensatz zu den meisten (wenn nicht allen anderen) Servern, in denen Sie Ihren Webserver einfach auf den Ordner verweisen, hält kawipiko
einen radikal anderen Ansatz: Um den statischen Inhalt zu bedienen Archivieren Sie den Inhalt in das CDB-Archiv durch kawipiko-archiver
, und dann kann man ihn aus dem CDB-Archiv durch kawipiko-server
bedienen .
Diese zweistufige Phase bietet auch einige Möglichkeiten:
zopfli
oder brotli
) anwenden, um CPU während des Einsatzes gegen Latenz und Bandbreite zur Laufzeit zu tauschen. Siehe das dedizierte Handbuch.
Dieses Dokument ist auch im Klartext oder als Mannseite verfügbar.
Siehe das dedizierte Handbuch.
Dieses Dokument ist auch im Klartext oder als Mannseite verfügbar.
Abrufen und extrahieren Sie das HTML -Archiv der Python 3.10 -Dokumentation:
Locke -s -s -f -O ./Python-3.10.1-docs-html.tar.bz2 https://docs.python.org/3/archives/python-3.10.1-docs-html.tar.bz2 # Teer -x -j -v -f ./python-3.10.1-docs-html.tar.bz2 #
Erstellen Sie das CDB -Archiv (ohne Komprimierung):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-nocomp.cdb --sources ./python-3.10.1-docs-html -Debug #
Erstellen Sie das CDB -Archiv (mit gzip
-Komprimierung):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-gzip.cdb --sources ./python-3.10.1-docs-html -komprimiert GZIP -Debug #
Erstellen Sie das CDB -Archiv (mit zopfli
-Komprimierung):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-zopfli.cdb --sources ./python-3.10.1-docs-html -kompress Zopfli -Debug #
Erstellen Sie das CDB -Archiv (mit brotli
-Komprimierung):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-brotli.cdb --sources ./python-3.10.1-docs-html -Compress brotli -Debug #
Servieren Sie das CDB -Archiv (mit gzip
-Komprimierung):
Kawipiko-Server -Bind 127.0.0.1:8080 --archive ./python-3.10.1-docs-html-gzip.cdb -archive-mmap -Archiv-Preload -Debug #
Vergleichen Sie Quellen und Archivgrößen:
du -h -s ./python-3.10.1-docs-html-nocomp.cdb ./python-3.10.1-docs-html-gzip.cdb ./python-3.10.1-docs-html-zopfli.cdb ./python-3.10.1-docs-html-brotli.cdb ./python-3.10.1-docs-html ./python-3.10.1-docs-html.tar.bz2 # 45m ./Python-3.10.1-docs-html-nocomp.cdb 9.7m ./python-3.10.1-docs-html-gzip.cdb ??? ./python-3.10.1-docs-html-zopfli.cdb 7.9m ./python-3.10.1-docs-html-brotli.cdb 46m ./Python-3.10.1-docs-html 6.0m ./python-3.10.1-docs-html.tar.bz2
Siehe das dedizierte Installationsdokument.
Das Folgende ist eine Liste der wichtigsten Funktionen:
gzip
, zopfli
oder brotli
komprimiert werden.mmap
) abbilden. Dieser handelt Speicher für CPU;rename
Syscall (oder das mv
-Tool) erreicht wird, werden alle bedienten Ressourcen gleichzeitig geändert._wildcard.*
Dateien (wo .*
sind die regulären Erweiterungen wie .txt
, .html
usw.), die verwendet werden, wenn eine tatsächliche Ressource unter diesem Ordner nicht gefunden wird. (Diese Dateien respektieren die hierarchische Baumstruktur, dh "tiefere" überschreiben diejenigen, die näher an "root";).)github.com/valyala/fasthttp
;net/http
;github.com/lucas-clemente/quic-go
; Das Folgende ist eine Liste der wichtigsten Funktionen, die derzeit fehlen und die geplant sind, um implementiert zu werden:
Content-Type
, Content-Length
, Content-Encoding
enthalten; zusätzlich Cache-Control: public, immutable, max-age=3600
, optional ETag
und einige TLs oder Sicherheits-Header können ebenfalls enthalten sein;)Host
-Header, vom Server und teilweise vom Archiver unterstützt.)https://github.com/tdewolff/minify
;404
Wildcards unterstützt;) Wie im Abschnitt über Abschnitt angegeben, kommt nichts kostenlos, und um all diese Funktionen bereitzustellen, mussten einige Ecken geschnitten werden:
Content-Encoding: brotli
), unabhängig davon, was der Browser akzeptiert (dh Akzeptanz, GZIP), serviert alle Ressourcen, wenn der Inhalt im CDB-Archiv mit Komprimierung (z. B. brotli
) gespeichert wurde (dh Accept-Encoding: gzip
). Gleiches gilt für unkomprimierte Inhalte; (Die Verwendung gzip
-Komprimierung ist jedoch immer sicher genug, da sie in praktisch allen Browsern- und HTTP -Clients da draußen implementiert ist;)Siehe das dedizierte Benchmarks -Dokument.
Wenn Sie auf einen Fehler gestoßen sind, verwenden Sie einfach die GitHub -Probleme.
Wenn Sie sich über etwas nicht sicher sind, möchten Sie Feedback geben oder neue Funktionen anfordern, verwenden Sie einfach die GitHub -Diskussionen.
Wenn Sie eine kurze Frage stellen möchten oder einfach einen kurzen Chat unterhalten möchten, gehen Sie einfach zum Discord -Kanal.
Ja, es serviert derzeit ~ 600.000 HTML -Seiten.
Als Open Source sind Sie jedoch dafür verantwortlich, dass es innerhalb Ihrer Anforderungen funktioniert!
Ich bin jedoch zur Beratung über den Einsatz und die Verwendung zur Verfügung. :)
CDB ist die von DJ Bernstein, https://cr.yp.to/cdb.html implementierte CDB-eingebettete Datenbank, und wurde in vielen Softwarelösungen verwendet, die von ihm implementiert wurden, insbesondere Qmail und TinyDNs. Von dort wurde es von vielen anderen Netzwerkdiensten aufgegriffen, die meist statische Suchtabellen mit niedrigem Überkopf benötigten, wie zum Beispiel Postfix als Alternative für die Benutzerdatenbank.
Bis ich erweitert habe, warum ich mich für die Verwendung von CDB für Service -statische Website -Inhalte ausgewählt habe, können Sie über den Sparkey von Spotify lesen.
Die verwendete CDB -Implementierung ist eine benutzerdefinierte Gabel der folgenden:
Denn Go ist sehr tragbar, sehr stabil und vor allem, weil es leicht miteinander verbundene Binärdateien auf jede Plattform unterstützt, die es unterstützt.
Da Rust nicht leicht mit Cross-Compiling (statisch oder dynamisch verknüpft) ausgestattet wird, die von ihnen unterstützt werden.
Weil Rost weniger tragbar ist als Go; Zum Beispiel betrachtet Rust OpenBSD nicht als "Tier-1" -Plattform.
Bitte sehen Sie auch die SBOM (Software -Materialien) für die Abhängigkeiten dieses Projekts und deren Autoren.
Der Code ist unter AGPL 3 oder höher lizenziert.
Wenn Sie den Code in diesem Repository ändern und für nicht personenbezogene Zwecke verwenden, müssen Sie ihn gemäß AGPL veröffentlichen.
Weitere Informationen zum Urheberrecht und zum Lizenzieren finden Sie in der Mitteilungsdatei im Ordner Dokumentation/Lizenzierung.
Wenn jemand verlangt, dass die Quellen und/oder die Dokumentation unter einer anderen Lizenz veröffentlicht werden, senden Sie bitte eine E -Mail an die Autoren, wobei die Lizenzanforderungen mit den Gründen und anderen Details begleitet werden. Abhängig von der Situation können die Autoren die Quellen und/oder die Dokumentation unter einer anderen Lizenz veröffentlichen.
Dieses Projekt enthält, wie viele andere Open-Source-Projekte, Code aus anderen Open-Source-Projekten (neben anderen Tools zur Entwicklung, Erstellung und Test).
Strengste in Bezug auf die Abhängigkeiten des Projekts (direkt und transitiv) finden Sie im SBOM (Software -Materialien) für Links zu diesen Abhängigkeiten und deren Lizenzen.
Siehe Dokument für dedizierte Referenzen.