Представлен выпуск проекта Redbean 2.0, предлагающего web-сервер, позволяющий поставлять web-приложения в форме универсального исполняемого файла, который может быть выполнен в Linux, Windows, MacOS, FreeBSD, NetBSD и OpenBSD. Все связанные с web-приложением и сервером ресурсы компонуются в один исполняемый файл, который при этом совместим с форматом архивов ZIP и позволяет использовать утилиту zip для добавления дополнительных файлов. Возможность запуска одного файла в разных ОС и его распознание как ZIP-архива достигается благодаря манипуляциям с заголовками исполняемых файлов и связыванием с многоплатформенной стандартной Си-библиотекой Cosmopolitan. Код проекта распространяется под лицензией ISC.
Идея проекта в поставке одного исполняемого файла “redbean.com” со встроенным web-сервером. Разработчик web-приложения может при помощи утилиты zip добавить в этот файл HTML и Lua-файлы и получить на выходе самодостаточное web-приложение, выполняемого во всех популярных ОС и не требующего для работы запуска в системе отдельного web-сервера.
После запуска полученного исполняемого файла, для обращения к сохранённому в файле web-приложению используется встроенный web-сервер. По умолчанию обработчик прикрепляется к localhost, но сервер может применяться и в качестве обычного публичного web-сервера (например, данный сервер обслуживает сайт проекта). Встроенный Web-сервер поддерживает обращение по HTTPS и может выполняться с использованием sandbox-изоляции, позволяющей контролировать к каким системным интерфейсам производится обращение. Для управления работой сервера во время его выполнения предоставляется интерактивный интерфейс REPL (на базе Lua REPL и библиотеки bestline, аналога GNU Readline), дающий возможность изменять состояние процесса в интерактивном режиме.
Утверждается, что web-сервер способен обработать более миллиона запросов в секунду на обычном ПК, отдавая контент, сжатый методом gzip. Высокой производительности способствует то, что zip и gzip используют общий формат, поэтому данные отдаются без перепаковки из уже сжатых областей в zip-файле. Кроме того, так как исполняемый файл создан с использованием статического связывания и имеет небольшой размер, вызов функции fork для него практически не приводит к накладным расходам при размещении в памяти.
Помимо обработки статического web-контента и выполнения JavaScript в браузере, логика приложения может расширяться при помощи скриптов на языке Lua, web-фреймворка Fullmoon и СУБД SQLite. Среди дополнительных возможностей отмечается поддержка схемы хэширования паролей argon2, возможность определения региона IP по базе MaxMind и доступ к более 1400 функциям API, предоставляемого библиотекой Cosmopolitan. Размер базового стека, включающего web-сервер, MbedTLS, Cosmopolitan, Lua и SQLite, составляет всего 1.9 МБ.
Универсальный исполняемый файл формируется путём совмещения специфичных для разных операционных систем сегментов и заголовков (PE, ELF, MACHO, OPENBSD, ZIP) в одном файле. Для обеспечения запуска одного исполняемого файла в Windows и Unix-системах применяется трюк, суть которого в кодировании файлов Windows PE в виде shell-скрипта, пользуясь тем, что Thompson Shell не использует маркер скриптов “#!”. В итоге создаётся исполняемый файл, в котором скомбинировано несколько разных форматов, используемых в Linux, BSD, Windows и macOS.
$ curl https://redbean.dev/redbean-demo-2.0.7.com >redbean.com $ chmod +x redbean.com $ ./redbean.com -v $ zip redbean.com hello.html $ zip redbean.com hello.lua $ ./redbean.com -vv I2022-04-29T07:17:28+000767:redbean] (srvr) listen https://127.0.0.1:8080 >: waiting for command… $ curl https://127.0.0.1:8080/hello.html hello $ printf ‘GET /hello.luann’ | nc 127.0.0.1 8080 hello