Se presenta la versión 2.0 del proyecto Redbean, que ofrece un servidor web que permite distribuir aplicaciones web en forma de un archivo ejecutable único, que puede ejecutarse en Linux, Windows, MacOS, FreeBSD, NetBSD y OpenBSD. Todos los recursos relacionados con la aplicación web y el servidor se compilan en un solo archivo ejecutable, que además es compatible con el formato de archivos ZIP y permite el uso de la utilidad zip para agregar archivos adicionales. La capacidad de ejecutar un solo archivo en diferentes sistemas operativos y su reconocimiento como un archivo ZIP se logra mediante manipulaciones en las cabeceras de archivos ejecutables y la vinculación con la biblioteca estándar de C multiplataforma Cosmopolitan. El código del proyecto se distribuye bajo la licencia ISC.
La idea del proyecto es proporcionar un archivo ejecutable único ‘redbean.com’ con un servidor web integrado. El desarrollador de aplicaciones web puede utilizar la utilidad zip para añadir archivos HTML y Lua a este archivo y obtener como resultado una aplicación web autosuficiente, que se ejecute en todos los sistemas operativos populares y que no requiera iniciar un servidor web separado en el sistema para funcionar.
Tras ejecutar el archivo ejecutable obtenido, se utiliza un servidor web integrado para acceder a la aplicación web guardada en el archivo. Por defecto, el manipulador se conecta a localhost, pero el servidor también puede utilizarse como un servidor web público normal (por ejemplo, este servidor gestiona el sitio del proyecto). El servidor web integrado soporta acceso mediante HTTPS y puede ejecutarse utilizando aislamiento en sandbox, que permite controlar a qué interfaces del sistema se realiza el acceso. Para gestionar el funcionamiento del servidor durante su ejecución, se proporciona una interfaz interactiva REPL (basada en Lua REPL y en la biblioteca bestline, un análogo de GNU Readline), que permite modificar el estado del proceso en modo interactivo.
Se afirma que el servidor web puede manejar más de un millón de solicitudes por segundo en una PC normal, entregando contenido comprimido con el método gzip. La alta eficiencia se debe a que zip y gzip utilizan un formato común, por lo que los datos se entregan sin necesidad de descomprimir desde áreas ya comprimidas en el archivo zip. Además, dado que el archivo ejecutable se creó utilizando enlace estático y tiene un tamaño pequeño, la llamada a la función fork no genera prácticamente ningún costo adicional al estar en memoria.
Además de procesar contenido web estático y ejecutar JavaScript en el navegador, la lógica de la aplicación web se puede ampliar mediante scripts en el lenguaje Lua, el marco web Fullmoon y la base de datos SQLite. Entre las características adicionales se encuentra el soporte para el esquema de hash de contraseñas argon2, la capacidad de determinar la región IP mediante la base de datos de MaxMind, y el acceso a la API de Unix de la biblioteca Cosmopolitan. El tamaño de la pila base, que incluye el servidor web, MbedTLS, Cosmopolitan, Lua y SQLite, es de solo 1.9 MB.
El archivo ejecutable universal se forma combinando segmentos y encabezados específicos de diferentes sistemas operativos (PE, ELF, MACHO, OPENBSD, ZIP) en un solo archivo. Para asegurarse de que un archivo ejecutable funcione en sistemas Windows y Unix, se aplica un truco que consiste en codificar archivos Windows PE como un script de shell, aprovechando que el Thompson Shell no utiliza el marcador de script "#!". Como resultado, se crea un archivo ejecutable que combina varios formatos diferentes utilizados en Linux, BSD, Windows y macOS. $ 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 >: waiting for command… $ curl https://127.0.0.1:8080/hello.html hello $ printf ‘GET /hello.lua\n\n’ | nc 127.0.0.1 8080 hello
Fuente: opennet.ru
