Table des matières:
- Manuel et exemples
- Installation et FAQ
- Caractéristiques et repères
- Copyright et licence, SBOM et références
- Discuter sur Discord, Discuter sur Github ou auteur de courriels
kawipiko
est un serveur HTTP statique léger écrit dans Go; axé sur le service du contenu statique aussi rapide et efficace que possible , avec la latence la plus faible et avec la consommation de ressources la plus faible (CPU, RAM, IO); Soutenir à la fois HTTP / 1 (avec ou sans TLS), HTTP / 2 et HTTP / 3 (sur Quic) ; Disponible en tant qu'exécutable lié statiquement unique sans autre dépendance.
Vous voulez voir kawipiko
en action?
/documentation
représente des sites statiques qui se compressent bien, en attendant /carina-nebula
, /openstreetmap
et /fontawesome
représente des sites statiques qui génèrent de nombreuses petites demandes; (Veuillez noter que cette instance est derrière CloudFlare, mais il a été invité à ne rien mettre en cache sur le bord;) (Le serveur est actuellement hébergé sur une connexion en fibre résidentielle;) Cependant, Simple n'implique pas de stupide ou limité , mais implique plutôt efficace par la suppression des caractéristiques superflues, étant ainsi en ligne avec l'ancienne philosophie d'Unix de "faire une chose et bien faire". Par conséquent, il prend en charge uniquement les GET
et ne fournit pas de fonctionnalités telles que la génération de contenu dynamique, l'authentification, la proxyation inverse, etc.; Pendant ce temps, il est toujours en train de fournir une compression ( gzip
, zopfli
ou brotli
), ainsi que la minimisation HTML-CSS-JS (TODO), sans affecter ses performances (en raison de son architecture unique comme décrit ci-dessous).
Ce que kawipiko
fournit est quelque chose de très unique, qu'aucun autre serveur HTTP n'offre: le contenu statique est servi à partir d'un fichier CDB sans latence (par rapport aux serveurs statiques classiques qui doivent encore passer par le système d'exploitation via la open-read-close
les systèmes). De plus, comme indiqué précédemment, le contenu statique peut toujours être compressé ou minifié à l'avance, réduisant ainsi non seulement le processeur mais aussi la bande passante et la latence.
Les fichiers CDB sont des fichiers de base de données binaires qui fournissent des tables de recherche de valeurs de clé en lecture seule efficaces, initialement utilisés dans certains serveurs DNS et SMTP, principalement pour leurs opérations de recherche plus bas "Mises à jour multi-enregistreuses. Cela les rend également adaptés au contenu statique de faible latence en service sur HTTP, ce que ce projet fournit.
Pour ceux qui connaissent Netlify (ou des concurrents comme les pages Cloudflare, les pages GitHub, etc.), kawipiko
est une alternative hôte-it-soi-même avec:
chroot
fichier, etc.Pour une liste complète des fonctionnalités, veuillez consulter la section des fonctionnalités. Malheureusement, il y a aussi certains compromis comme décrit dans la section Limitations (bien qu'aucun ne soit critique).
En ce qui concerne les performances, comme décrit dans la section Benchmarks, kawipiko
est au moins sur la parole avec Nginx, soutenant plus de 100 000 demandes / seconde avec 0,25 ms de latence pour 99% des demandes même sur mon ordinateur portable de 6 ans. Cependant, le principal avantage par rapport à Nginx n'est pas des performances brutes, mais le déploiement et la simplicité de la configuration, ainsi que la gestion et le stockage efficaces de grandes collections de nombreux petits fichiers.
En ce qui concerne kawipiko
j'ai également publié quelques articles sur mon propre site:
seccomp
pour améliorer la sécurité en réduisant la surface d'attaque;kawipiko
;)Le projet fournit les exécutables suivants (liés statiquement, sans aucune autre dépendance):
kawipiko-server
- qui sert le contenu statique de l'archive CDB via HTTP (avec ou sans TLS), HTTP / 2 ou HTTP / 3 (sur Quic);kawipiko-archiver
- qui crée l'archive CDB à partir d'un dossier source tenant le contenu statique, compressant éventuellement des fichiers et minimisation;kawipiko
- Un exécutable tout-en-un qui regroupe toutes les fonctionnalités en un seul exécutable; (IE kawipiko server ...
ou kawipiko archiver ...
); Contrairement à la plupart (sinon à la totalité) d'autres serveurs à l'extérieur, dans lesquels vous indiquez simplement votre serveur Web vers le dossier tenant la racine du contenu du site Web statique, kawipiko
adopte une approche radicalement différente: afin de servir le contenu statique, il faut d'abord Archiver le contenu dans l'archive CDB via kawipiko-archiver
, puis on peut le servir à partir de l'archive CDB via kawipiko-server
.
Cette phase en deux étapes présente également quelques opportunités:
zopfli
ou brotli
), pour échanger le CPU pendant le déploiement par rapport à la latence et la bande passante au moment de l'exécution. Voir le manuel dédié.
Ce document est également disponible en texte brut ou en tant que page d'homme.
Voir le manuel dédié.
Ce document est également disponible en texte brut ou en tant que page d'homme.
Récupérer et extraire la documentation Python 3.10 Archive HTML:
curl -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 # tar -x -j -v -f ./python-3.10.1-docs-html.tar.bz2 #
Créez l'archive CDB (sans aucune compression):
kawipiko-archiver --archive ./python-3.10.1-docs-html-nocomp.cdb --Sources ./python-3.10.1-docs-html - debug #
Créez l'archive CDB (avec compression gzip
):
kawipiko-archiver --archive ./python-3.10.1-docs-html-gzip.cdb --Sources ./python-3.10.1-docs-html - compression gzip - debug #
Créez l'archive CDB (avec la compression zopfli
):
kawipiko-archiver --archive ./python-3.10.1-docs-html-zopfli.cdb --Sources ./python-3.10.1-docs-html - compression zopfli - debug #
Créez l'archive CDB (avec compression brotli
):
kawipiko-archiver --archive ./python-3.10.1-docs-html-brotli.cdb --Sources ./python-3.10.1-docs-html - compression brotli - debug #
Servir l'archive CDB (avec compression gzip
):
kawipiko-server --Bind 127.0.0.1:8080 --archive ./python-3.10.1-docs-html-gzip.cdb --archive-mmap - Archive-preload - debug #
Comparez les sources et les tailles d'archives:
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-nococomp.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
Voir le document d'installation dédié.
Ce qui suit est une liste des caractéristiques les plus importantes:
gzip
, zopfli
ou brotli
;mmap
); Cela échange la mémoire contre CPU;rename
Syscall (ou l'outil mv
), toutes les ressources servies sont observées en même temps;_wildcard.*
Fichiers (où .*
sont les extensions régulières comme .txt
, .html
, etc.) qui seront utilisées si une ressource réelle n'est pas trouvée sous ce dossier; (Ces fichiers respectent la structure de l'arborescence hiérarchique, c'est-à-dire que celles "plus profondes" l'emportent sur celles plus près de "root";)github.com/valyala/fasthttp
;net/http
;github.com/lucas-clemente/quic-go
; Ce qui suit est une liste des fonctionnalités les plus importantes qui manquent actuellement et qui devraient être implémentées:
Cache-Control: public, immutable, max-age=3600
seuls Content-Type
, Content-Length
, Content-Encoding
sont inclus ETag
Host
, sont pris en charge par le serveur, et partiellement par l'archiver;)https://github.com/tdewolff/minify
;404
chances sont soutenues;) Comme indiqué dans la section à propos, rien ne vient gratuitement, et pour fournir toutes ces fonctionnalités, certains coins devaient être coupés:
brotli
), le serveur servira toutes les ressources compressées (c'est-à-dire Content-Encoding: brotli
), quelle que soit ce que le navigateur accepte (c'est-à-dire Accept-Encoding: gzip
); Il en va de même pour le contenu non compressé; (Cependant, l'utilisation de la compression gzip
est suffisamment sûre, car elle est implémentée dans pratiquement tous les navigateurs et clients HTTP;)Voir le document de référence dédié.
Si vous avez rencontré un bogue, utilisez simplement les problèmes de github.
Si vous n'êtes pas sûr de quelque chose, souhaitez donner des commentaires ou demandez de nouvelles fonctionnalités, utilisez simplement les discussions GitHub.
Si vous voulez poser une question rapide, ou simplement discuter rapidement, rendez-vous simplement sur la chaîne Discord.
Oui, il dessert actuellement ~ 600k pages HTML.
Bien qu'étant open source, vous êtes responsable de vous assurer que cela fonctionne dans vos besoins!
Cependant, je suis disponible pour consulter son déploiement et son utilisation. :)
CDB est la vénérable base de données embarquée à valeur clé implémentée par DJ Bernstein, https://cr.yp.to/cdb.html, et a été utilisée dans de nombreuses solutions logicielles implémentées par lui, notamment Qmail et TinyDNS. De là, il a été repris par de nombreux autres services de réseau qui nécessitaient des tables de recherche à bas niveau principalement statiques, comme par exemple Postfix comme alternative pour sa base de données utilisateur.
Jusqu'à ce que j'étends pourquoi j'ai choisi d'utiliser CDB pour le contenu du site Web statique du service, vous pouvez lire sur la touche claire de Spotify.
L'implémentation CDB utilisée est une fourche personnalisée des éléments suivants:
Parce que GO est hautement portable, très stable, et surtout parce qu'il peut facilement prendre en charge les binaires interpositifs liés statiquement à n'importe quelle plate-forme qu'il prend en charge.
Parce que Rust ne prend pas facilement en charge les exécutables transformables (liés statiquement ou dynamiquement liés) à n'importe quelle plate-forme qu'il prend en charge.
Parce que la rouille est moins portable que Go; Par exemple, Rust ne considère pas OpenBSD comme une plate-forme "de niveau 1".
Veuillez également consulter le SBOM (Bill de matériaux logiciels) pour les liens des dépendances de ce projet et leurs auteurs.
Le code est sous licence en vertu de l'AGPL 3 ou version ultérieure.
Si vous modifiez le code dans ce référentiel et l'utilisez à des fins non personnelles , vous devrez le publier selon AGPL.
Pour plus de détails sur le droit d'auteur et les licences, veuillez consulter le fichier d'avis dans le dossier de documentation / licence.
Si une personne exige que les sources et / ou la documentation soient publiées sous une autre licence, veuillez envoyer un e-mail aux auteurs, indiquant les exigences de licence, accompagnés des raisons et d'autres détails; Ensuite, selon la situation, les auteurs peuvent divulguer les sources et / ou la documentation sous une autre licence.
Ce projet, comme de nombreux autres projets open source, intègre le code à partir d'autres projets open source (en plus d'autres outils utilisés pour développer, construire et tester).
Strictement lié aux dépendances du projet (directe et transitive), veuillez consulter la SBOM (facture de matériel logiciel) pour les liens vers ces dépendances et leurs licences.
Voir le document de références dédié.