Índice:
- Manual e exemplos
- Instalação e FAQ
- Recursos e benchmarks
- Sobre direitos autorais e licenciamento, SBOM e referências
- Converse em discórdia, discuta no Github ou autor de e -mail
kawipiko
é um servidor HTTP estático leve escrito em Go; focado em servir o conteúdo estático o mais rápido e eficiente possível , com a menor latência e com o menor consumo de recursos (CPU, RAM, IO); Suportar HTTP/1 (com ou sem TLS), HTTP/2 e HTTP/3 (sobre quic) ; Disponível como um único executável estaticamente vinculado sem outras dependências.
Quer ver kawipiko
em ação?
/documentation
representa sites estáticos que comprimem bem, enquanto isso /carina-nebula
, /openstreetmap
e /fontawesome
representa sites estáticos que geram muitas solicitações pequenas; (Observe que esta instância está por trás do CloudFlare, no entanto, foi instruído a não armazenar em cache nada no limite;) (O servidor está atualmente hospedado em uma conexão de fibra residencial;) No entanto, o Simple não implica burro ou limitado , mas implica eficiente através da remoção de características supérfluas, sendo alinhada com a antiga filosofia da Unix de "fazer uma coisa e faça bem". Portanto, ele suporta apenas GET
e não fornece recursos como geração dinâmica de conteúdo, autenticação, proxy reverso, etc.; Enquanto isso, ainda fornece compressão ( gzip
, zopfli
ou brotli
), além de Minificação HTML-CSS-JS (TODO), sem afetar seu desempenho (devido à sua arquitetura exclusiva, conforme descrito abaixo).
O que kawipiko
fornece é algo muito único, que nenhum outro servidor HTTP oferece: o conteúdo estático é servido de um arquivo CDB sem quase nenhuma latência (em comparação com servidores estáticos clássicos que ainda precisam passar pelo sistema operacional através da open-read-close
syscalls). Além disso, como observado anteriormente, o conteúdo estático ainda pode ser comprimido ou minificado com antecedência, reduzindo assim não apenas a CPU, mas também a largura de banda e a latência.
Os arquivos CDB são arquivos de banco de dados binários que fornecem tabelas de pesquisa de valor-chave eficiente apenas para leitura, usadas inicialmente em alguns servidores DNS e SMTP, principalmente para suas operações de pesquisa de baixo custo, bloqueio zero em cenários multidreados / multiprocessos e "atômico "Atualizações de vários registros. Isso também os torna adequados para conteúdo estático de baixa latência que serve sobre o HTTP, que é o que este projeto fornece.
Para aqueles familiarizados com o Netlify (ou concorrentes como CloudFlare Pages, Github Pages etc.), kawipiko
é uma alternativa de host-si mesmo, apresentando:
chroot
abre arquivos, etc.Para uma lista completa de recursos, consulte a seção de recursos. Infelizmente, também existem algumas compensações descritas na seção de limitações (embora nenhuma seja crítica).
No que diz respeito ao desempenho, conforme descrito na seção de benchmarks, kawipiko
está pelo menos no par com o NGINX, sustentando mais de 100 mil solicitações / segundo com latência de 0,25ms para 99% das solicitações, mesmo no meu laptop de 6 anos. No entanto, a principal vantagem sobre o NGINX não é o desempenho bruto, mas a simplicidade de implantação e configuração, além de gerenciamento e armazenamento eficientes de grandes coleções de muitos arquivos pequenos.
Em relação a kawipiko
também publiquei alguns artigos em meu próprio site:
seccomp
da Linux para melhorar a segurança, reduzindo a superfície de ataque;kawipiko
;)O projeto fornece os seguintes executáveis (estaticamente vinculados, sem outras dependências):
kawipiko-server
-que serve o conteúdo estático do arquivo CDB via http (com ou sem TLS), http/2 ou http/3 (sobre quic);kawipiko-archiver
-que cria o arquivo CDB a partir de uma pasta de origem que mantém o conteúdo estático, opcionalmente comprimindo e minificando arquivos;kawipiko
-um executável tudo em um que agrupa toda a funcionalidade em um executável; (por exemplo, kawipiko server ...
ou kawipiko archiver ...
); Ao contrário da maioria (se não todos) outros servidores, por isso, nos quais você apenas aponta seu servidor da web para a pasta que segura a raiz do conteúdo do site estático, kawipiko
adota uma abordagem radicalmente diferente: para servir o conteúdo estático, é preciso primeiro Arquive o conteúdo no arquivo CDB através kawipiko-archiver
e, em seguida, pode servir -o do arquivo CDB através do kawipiko-server
.
Esta fase de duas etapas também apresenta algumas oportunidades:
zopfli
ou brotli
), para negociar CPU durante a implantação versus a latência e a largura de banda em tempo de execução. Veja o manual dedicado.
Este documento também está disponível em texto sem formatação ou na página de um homem.
Veja o manual dedicado.
Este documento também está disponível em texto sem formatação ou na página de um homem.
buscar e extrair o arquivo HTML da documentação do Python 3.10:
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 #
Crie o arquivo CDB (sem qualquer compactação):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-nocomp.cdb -Sources ./Python-3.10.1-docs-html -Debug #
Crie o arquivo CDB (com compactação gzip
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-gzip.cdb -Sources ./Python-3.10.1-docs-html --Compressa gzip -Debug #
Crie o arquivo CDB (com compactação zopfli
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-zopfli.cdb -Sources ./Python-3.10.1-docs-html --Compress Zopfli -Debug #
Crie o Arquivo CDB (com compactação brotli
):
Kawipiko-Archiver --archive ./python-3.10.1-docs-html-brotli.cdb -Sources ./Python-3.10.1-docs-html --Compress Brotli -Debug #
Sirva o arquivo CDB (com compactação gzip
):
Kawipiko-Server -Bind 127.0.0.1:8080 --archive ./python-3.10.1-docs-html-gzip.cdb --archive-mmap --archive-preload -Debug #
Compare fontes e tamanhos de arquivo:
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-totli.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-trotli.cdb 46m ./python-3.10.1-docs-html 6.0m ./python-3.10.1-docs-html.tar.bz2
Consulte o documento de instalação dedicado.
A seguir, é apresentada uma lista dos recursos mais importantes:
gzip
, zopfli
ou brotli
;mmap
); Isso negocia memória pela CPU;rename
(ou a ferramenta mv
), todos os recursos servidos são observados para mudar ao mesmo tempo;_wildcard.*
Arquivos (onde .*
são as extensões regulares como .txt
, .html
, etc.) que serão usadas se um recurso real não for encontrado nessa pasta; (Esses arquivos respeitam a estrutura hierárquica da árvore, ou seja, os "mais profundos" substituem os mais próximos de "root";)github.com/valyala/fasthttp
;net/http
do GO;github.com/lucas-clemente/quic-go
; A seguir, é apresentada uma lista dos recursos mais importantes que estão ausentes e planejados para serem implementados:
Content-Type
, Content-Length
e Content-Encoding
estão incluídos; adicionalmente Cache-Control: public, immutable, max-age=3600
, opcionalmente ETag
e alguns cabeçalhos relacionados a TLS ou segurança também podem ser incluídos;)Host
, é suportado pelo servidor e parcialmente pelo arquiver;)https://github.com/tdewolff/minify
;404
curinga são suportados;) Conforme declarado na seção Sobre, nada vem de graça e, para fornecer todos esses recursos, alguns cantos tiveram que ser cortados:
brotli
), o servidor servirá a todos os recursos compactados (ou seja, Content-Encoding: brotli
), independentemente do que o navegador aceita (ou seja Accept-Encoding: gzip
); O mesmo se aplica ao conteúdo não compactado; (No entanto, sempre o uso da compactação gzip
é seguro o suficiente, pois é implementado em praticamente todos os navegadores e clientes HTTP por aí;)Veja o documento de benchmarks dedicado.
Se você encontrou um bug, basta usar os problemas do GitHub.
Se você não tiver certeza de algo, deseja dar feedback ou solicitar novos recursos, basta usar as discussões do Github.
Se você quiser fazer uma pergunta rápida ou apenas conversar rapidamente, basta ir para o canal Discord.
Sim, atualmente está servindo ~ 600K HTML Pages.
Embora, seja de código aberto, você é responsável por garantir que ele funcione dentro de seus requisitos!
No entanto, estou disponível para consultar sua implantação e uso. :)
O CDB é o venerável banco de dados incorporado de valor-chave implementado pelo DJ Bernstein, https://cr.yp.to/cdb.html, e foi usado em muitas soluções de software implementadas por ele, principalmente Qmail e Tinydns. A partir daí, foi capturado por muitos outros serviços de rede que exigiam principalmente tabelas de pesquisa de baixa sobrecote estática, como por exemplo, o Postfix como uma alternativa para o banco de dados do usuário.
Até expandir por que escolhi usar o CDB para o conteúdo do site estático de serviço, você pode ler sobre o Sparkey do Spotify.
A implementação do CDB que está sendo usada é um garfo personalizado do seguinte:
Porque o GO é altamente portátil, altamente estável e especialmente porque pode suportar facilmente binários estaticamente vinculados com compilação cruzada a qualquer plataforma que suporta.
Porque a ferrugem não suporta facilmente os executivos cruzados (estaticamente ou dinamicamente vinculados) a qualquer plataforma que ele suporta.
Porque a ferrugem é menos portátil do que ir; Por exemplo, Rust não considera o OpenBSD como uma plataforma "Tier-1".
Consulte também o SBOM (Lei de Materiais de Software) para links dependências deste projeto e seus autores.
O código é licenciado em 3 AGPL ou posterior.
Se você alterar o código dentro deste repositório e usá- lo para fins não pessoais , precisará lançá-lo como AGPL.
Para obter detalhes sobre os direitos autorais e licenciamento, consulte o arquivo de aviso na pasta Documentation/Licensing.
Se alguém exigir que as fontes e/ou documentação sejam divulgadas sob uma licença diferente, envie um email aos autores, declarando os requisitos de licenciamento, acompanhados dos motivos e outros detalhes; Então, dependendo da situação, os autores podem liberar as fontes e/ou documentação sob uma licença diferente.
Este projeto, como muitos outros projetos de código aberto, incorpora código de outros projetos de código aberto (além de outras ferramentas usadas para desenvolver, construir e testar).
Estritamente relacionado às dependências do projeto (direto e transitivo), consulte o SBOM (Lei de Materiais de Software) para links para essas dependências e suas licenças.
Veja o documento de referências dedicadas.