Веб-сервер одним файлом на шелле в 24 килобайта с шахматами и поэтессами

Зайчатки разума

Записная книжка айтишника

Веб-сервер одним файлом на шелле в 24 килобайта с шахматами и поэтессами

2018-11-06 00:50:24 — Evgeniy Shumilov

  Когда я начинал вести этот блог, у меня было стойкое ощущение, что писать мне будет не о чем, но снова и снова я нахожу какие-то интересные вещи, которыми хотелось бы поделиться.  Иногда я нахожу их заброшенными, достаю из бекапов, причёсываю, привожу в более-менее нормальный вид, исправляю какие-то ошибки, пишу документацию, выкладываю на github. Вот так и сейчас. Для тестирования блога мне периодически нужен вебсервер. Вебсервер, который должен выполнять только одну функцию - отдавать браузеру HTML. Можно конечно открыть файл самим браузером из файловой системы, но тогда ломаются ссылки на графику и локальные ресуры вида /images/imagename.png. В качестве вебсервера я обычно запускал python c соответствующим модулем: python -m SimpleHTTPServer. В принципе, этого хватает, но дёргать за хвост целый интерпретатор пайтона ради отдачи HTML - это какой-то overkill. Тогда я и вспомнил, что когда-то написал веб-сервер на шелле. Кто сказал, что нельзя написать веб-сервер на шелле?


  Точнее, на том, что предоставляет busybox. Штука интересна уже тем, что умещается в 24 килобайта и помимо отдачи HTML (конечно же, в однопоточном режиме), он умеет выводить красивый индекс (css и svg пиктограммы встроены, нарисовал тоже сам) - отображать список директорий и файлов с подсветкой, их размеры, даты изменения, позволяет скачивать файлы и папки сразу завёрнутыми в архивы gzip и bzip, умеет разные уровни логирования, кастомные html c сообщениями об ошибках. Немного не хватило времени и терпения для реализации CGI на шелле и обработки POST запросов.

  А так как для работы требуется один лишь busybox, то работать эта штука будет где угодно, где busybox есть/можно поставить. То есть, оно прекрасно будет себя чувствовать на андроиде (при замене environment в первой строке скрипта), огромном количестве роутеров, openwrt, внутри alpine контейнеров, на MacOS и где только не. Для тестирования bashblog - так вообще идеальный вариант. Замеров не делал, но судя по ощущениям, работает быстрее, чем python с модулем SimpleHTTPServer. Конечно, это не для продакшена, секьюрити тестов серьёзных не проводил, не для того было создано.

Выложил сюда: https://github.com/alive-corpse/bbhttpd

Теги: shell, web, minimalism

comments powered by Disqus