Prezentujemy wydanie projektu Redbean 2.0, który oferuje serwer webowy pozwalający dostarczać aplikacje webowe w formie uniwersalnego pliku wykonywalnego, który może działać w Linuxie, Windowsie, MacOS, FreeBSD, NetBSD i OpenBSD. Wszystkie zasoby związane z aplikacją webową i serwerem są kompilowane w jeden plik wykonywalny, który jednocześnie jest zgodny z formatem archiwów ZIP i pozwala używać narzędzia zip do dodawania dodatkowych plików. Możliwość uruchomienia jednego pliku w różnych systemach operacyjnych oraz jego rozpoznawanie jako archiwum ZIP osiągnięto dzięki manipulacjom z nagłówkami plików wykonywalnych oraz powiązaniu z wieloplatformową standardową biblioteką C Cosmopolitan. Kod projektu jest udostępniany na licencji ISC.
Ideą projektu jest dostarczenie jednego pliku wykonywalnego „redbean.com” z wbudowanym serwerem webowym. Programista aplikacji webowej może za pomocą narzędzia zip dodać do tego pliku pliki HTML i Lua, uzyskując na wyjściu samodzielną aplikację webową, działającą na wszystkich popularnych systemach operacyjnych i nie wymagającą uruchamiania oddzielnego serwera webowego w systemie.
Po uruchomieniu uzyskanego pliku wykonywalnego, do odwołania się do zapisanej w pliku aplikacji webowej używa się wbudowanego serwera webowego. Domyślnie, handler jest przypisany do localhost, ale serwer może być również używany jako zwykły publiczny serwer webowy (na przykład, ten serwer obsługuje stronę projektu). Wbudowany serwer webowy obsługuje połączenia HTTPS i może być uruchamiany z użyciem izolacji sandbox, co pozwala kontrolować, do jakich interfejsów systemowych następuje odwołanie. Do zarządzania pracą serwera w trakcie jego działania udostępniony jest interaktywny interfejs REPL (oparty na Lua REPL i bibliotece bestline, analog GNU Readline), umożliwiający zmianę stanu procesu w trybie interaktywnym.
Twierdzi się, że serwer web jest w stanie obsłużyć ponad milion zapytań na sekundę na standardowym komputerze, dostarczając treści skompresowane metodą gzip. Wysoką wydajność zapewnia fakt, że zip i gzip używają wspólnego formatu, dlatego dane są przekazywane bez ponownego pakowania z już skompresowanych obszarów w pliku zip. Dodatkowo, ponieważ plik wykonywalny został stworzony przy użyciu statycznego wiązania i ma niewielki rozmiar, wywołanie funkcji fork niemal nie generuje kosztów przy umieszczaniu w pamięci.
Oprócz obsługi statycznych treści webowych i wykonywania JavaScript w przeglądarce, logikę aplikacji webowej można rozszerzać za pomocą skryptów w języku Lua, frameworka webowego Fullmoon oraz bazy danych SQLite. Do dodatkowych możliwości należy obsługa algorytmu haszowania haseł argon2, możliwość określenia regionu IP na podstawie bazy MaxMind oraz dostęp do interfejsu API Unix biblioteki Cosmopolitan. Rozmiar podstawowego stosu, zawierającego serwer web, MbedTLS, Cosmopolitan, Lua i SQLite, wynosi zaledwie 1,9 MB.
Uniwersalny plik wykonywalny jest tworzony przez połączenie segmentów i nagłówków specyficznych dla różnych systemów operacyjnych (PE, ELF, MACHO, OPENBSD, ZIP) w jednym pliku. Aby zapewnić uruchomienie jednego pliku wykonywalnego w systemach Windows i Unix, stosuje się trik polegający na kodowaniu plików Windows PE w postaci skryptu powłoki, korzystając z faktu, że powłoka Thompsona nie używa znacznika skryptu «#!». W rezultacie powstaje plik wykonywalny, w którym skombinowano kilka różnych formatów używanych w Linuxie, BSD, Windows i 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
Źródło: opennet.ru
