Tabla de contenido:
- Manual y ejemplos
- Instalación y preguntas frecuentes
- Características y puntos de referencia
- Acerca de, derechos de autor y licencias, SBOM y referencias
- Chatear en Discord, discutir sobre GitHub o por correo electrónico
kawipiko
es un servidor HTTP estático ligero escrito en GO; centrado en servir contenido estático lo más rápido y eficiente posible , con la latencia más baja y con el consumo de recursos más bajo (CPU, RAM, IO); admitiendo tanto http/1 (con o sin TLS), http/2 y http/3 (sobre quic) ; Disponible como un solo ejecutable estáticamente vinculado sin ninguna otra dependencia.
¿Quieres ver kawipiko
en acción?
/documentation
representa sitios estáticos que se compriman bien, mientras tanto /carina-nebula
, /openstreetmap
y /fontawesome
representa sitios estáticos que generan muchas solicitudes pequeñas; (Tenga en cuenta que esta instancia está detrás de CloudFlare, sin embargo, se le indicó que no almacene en caché nada en el borde;) (El servidor está alojado actualmente a través de una conexión de fibra residencial;) Sin embargo, Simple no implica tonto o limitado , sino que implica eficiente mediante la eliminación de características superfluas, lo que está en línea con la antigua filosofía de Unix de "hacer una cosa y hacerlo bien". Por lo tanto, es compatible con las solicitudes GET
, y no proporciona características como generación de contenido dinámico, autenticación, proxy inverso, etc.; Mientras tanto, todavía proporciona compresión ( gzip
, zopfli
o brotli
), más HTML-CSS-JS Minify (TODO), sin afectar su rendimiento (debido a su arquitectura única como se describe a continuación).
Lo que kawipiko
proporciona es algo único, que ningún otro servidor HTTP ofrece: el contenido estático se sirve desde un archivo CDB casi sin latencia (en comparación con los servidores estáticos clásicos que aún tienen que pasar a través del sistema operativo a través de la open-read-close
syscalls). Además, como se señaló anteriormente, el contenido estático aún puede comprimirse o minificarse con anticipación, reduciendo así no solo la CPU sino también el ancho de banda y la latencia.
Los archivos CDB son archivos de base de datos binarios que proporcionan tablas de búsqueda de valor clave de solo lectura eficientes de solo lectura, utilizadas inicialmente en algunos servidores DNS y SMTP, principalmente para sus operaciones de búsqueda de bajo nivel, cero en escenarios de múltiples procesos múltiples / multiprocesos, y "Atomicic "Actualizaciones de múltiples récords. Esto también los hace adecuados para el contenido estático de baja latencia que sirve sobre HTTP, que es lo que proporciona este proyecto.
Para aquellos familiarizados con Netlify (o competidores como Cloudflare Pages, Github Pages, etc.), kawipiko
es una alternativa de anfitrión de usted mismo con:
chroot
fácilmente o contenedoras como está en la moda en estos días;)Para obtener una lista completa de características, consulte la sección de características. Desafortunadamente, también hay algunas compensaciones como se describe en la sección de limitaciones (aunque ninguno es crítico).
Con respecto al rendimiento, como se describe en la sección de puntos de referencia, kawipiko
está al menos en par con NGINX, manteniendo más de 100k solicitudes / segundo con una latencia de 0.25ms para el 99% de las solicitudes incluso en mi computadora portátil de 6 años. Sin embargo, la principal ventaja sobre NGINX no es el rendimiento en bruto, sino la simplicidad de implementación y configuración, además de la gestión eficiente y el almacenamiento de grandes colecciones de muchos archivos pequeños.
En relación con kawipiko
también he publicado algunos artículos en mi propio sitio:
seccomp
de Linux para mejorar la seguridad al reducir la superficie de ataque;kawipiko
;)El proyecto proporciona los siguientes ejecutables (estáticamente vinculado, sin ninguna otra dependencia):
kawipiko-server
: que sirve el contenido estático del archivo CDB a través de http (con o sin TLS), http/2 o http/3 (sobre quic);kawipiko-archiver
: que crea el archivo CDB desde una carpeta de origen que contiene el contenido estático, opcionalmente comprimiendo y minificando archivos;kawipiko
: un ejecutable todo en uno que agrupa toda la funcionalidad en un ejecutable; (es decir, kawipiko server ...
o kawipiko archiver ...
); A diferencia de la mayoría (si no todos) otros servidores, en el que solo apunta a su servidor web a la carpeta que contiene la raíz del contenido del sitio web estático, kawipiko
adopta un enfoque radicalmente diferente: para servir el contenido estático, uno primero debe Archive el contenido en el archivo CDB a través de kawipiko-archiver
, y luego uno puede servirlo desde el archivo CDB a través de kawipiko-server
.
Esta fase de dos pasos también presenta algunas oportunidades:
zopfli
o brotli
), para intercambiar CPU durante la implementación frente a la latencia y el ancho de banda en tiempo de ejecución. Ver el manual dedicado.
Este documento también está disponible en texto plano, o como una página man.
Ver el manual dedicado.
Este documento también está disponible en texto plano, o como una página man.
Obtenga y extraiga el archivo de documentación de Python 3.10 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 # alquitrán -x -j -v -f ./python-3.10.1-docs-html.tar.bz2 #
Cree el archivo CDB (sin compresión):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-nocomp.cdb --sources ./python-3.10.1-docs-html --esporta #
Cree el archivo CDB (con compresión gzip
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-gzip.cdb --sources ./python-3.10.1-docs-html --Compresión Gzip --esporta #
Cree el archivo CDB (con compresión zopfli
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-zopfli.cdb --sources ./python-3.10.1-docs-html --Compresión Zopfli --esporta #
Cree el archivo CDB (con compresión brotli
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-botli.cdb --sources ./python-3.10.1-docs-html --Compress Brotli --esporta #
Sirva el archivo CDB (con compresión gzip
):
Kawipiko-server ---ing 127.0.0.1:8080 --archive ./python-3.10.1-docs-html-gzip.cdb --archive-mmap -Archive-Peload --esporta #
Compare fuentes y tamaños de archivo:
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
Consulte el documento de instalación dedicado.
La siguiente es una lista de las características más importantes:
gzip
, zopfli
o brotli
;mmap
); Esto intercambia memoria por CPU;rename
(o la herramienta mv
), se observa que todos los recursos atendidos cambian al mismo tiempo;_wildcard.*
archivos (donde .*
son las extensiones regulares como .txt
, .html
, etc.) que se utilizará si no se encuentra un recurso real en esa carpeta; (Estos archivos respetan la estructura jerárquica del árbol, es decir, los "más profundos" anulan los más cercanos a "root";)github.com/valyala/fasthttp
;net/http
de Go Go;github.com/lucas-clemente/quic-go
; La siguiente es una lista de las características más importantes que faltan actualmente y se planean para implementarse:
Content-Type
contenido, Content-Length
, Content-Encoding
; además, Cache-Control: public, immutable, max-age=3600
, opcionalmente ETag
, y también se pueden incluir algunos TLS o encabezados relacionados con la seguridad;);)Host
, es compatible con el servidor, y parcialmente por el archivador;)https://github.com/tdewolff/minify
;404
comodines;) Como se indica en la sección Acerca de, nada viene de forma gratuita, y para proporcionar todas estas características, algunas esquinas tuvieron que cortarse:
brotli
), el servidor servirá todos los recursos comprimidos (es decir, Content-Encoding: brotli
), independientemente de lo que el navegador acepte (es decir, Accept-Encoding: gzip
); Lo mismo se aplica para contenido sin comprimir; (Sin embargo, siempre usar la compresión gzip
es lo suficientemente segura, ya que se implementa en prácticamente todos los navegadores y clientes HTTP;)Vea el documento de referencia dedicado.
Si ha encontrado un error, solo use los problemas de GitHub.
Si no está seguro de algo, desea dar comentarios o solicitar nuevas funciones, solo use las discusiones de GitHub.
Si desea hacer una pregunta rápida o simplemente tener una conversación rápida, simplemente diríjase al canal Discord.
Sí, actualmente está sirviendo ~ 600k páginas HTML.
Aunque, siendo de código abierto, ¡usted es responsable de asegurarse de que funcione dentro de sus requisitos!
Sin embargo, estoy disponible para consultar sobre su implementación y uso. :)
CDB es la venerable base de datos integrada de valor clave implementada por DJ Bernstein, https://cr.yp.to/cdb.html, y se utilizó en muchas soluciones de software implementadas por él, especialmente Qmail y Tinydns. A partir de ahí, fue recogido por muchos otros servicios de red que requerían tablas de búsqueda de bajo nivel en su mayoría estatales, como por ejemplo, Postfix como alternativa para su base de datos de usuarios.
Hasta que amplíe por qué he elegido usar CDB para el contenido de sitio web estático de servicio, puede leer sobre Sparkey de Spotify.
La implementación de CDB que se utiliza es una bifurcación personalizada de lo siguiente:
Debido a que GO es altamente portátil, altamente estable y especialmente porque puede soportar fácilmente la compilación cruzada de binarios vinculados estáticamente a cualquier plataforma que admita.
Debido a que el óxido no puede admitir fácilmente los ejecutables de compilación cruzada (estática o dinámica) a cualquier plataforma que admita.
Porque el óxido es menos portátil que Go; Por ejemplo, Rust no considera OpenBSD como una plataforma "Tier-1".
Consulte también el SBOM (factura de materiales de software) para obtener enlaces a las dependencias de este proyecto y sus autores.
El código tiene licencia bajo AGPL 3 o posterior.
Si cambia el código dentro de este repositorio y lo usa para fines no personales , tendrá que divulgarlo según AGPL.
Para obtener detalles sobre los derechos de autor y la licencia, consulte el archivo de notificación en la carpeta de documentación/licencia.
Si alguien requiere que las fuentes y/o la documentación se publiquen bajo una licencia diferente, envíe un correo electrónico a los autores, indicando los requisitos de licencia, acompañados de los motivos y otros detalles; Luego, dependiendo de la situación, los autores pueden liberar las fuentes y/o la documentación bajo una licencia diferente.
Este proyecto, como muchos otros proyectos de código abierto, incorpora código de otros proyectos de código abierto (además de otras herramientas utilizadas para desarrollar, construir y probar).
Estrictamente relacionada con las dependencias del proyecto (directas y transitivas), consulte el SBOM (factura de materiales de software) para obtener enlaces a estas dependencias y sus licencias.
Vea el documento de referencias dedicadas.